如何解决如何用树语法中的文本重写令牌?
| 这是我的树语法:grammar t;
options{
output = AST;
}
type
:
\'NVARCHAR\' -> \"VARCHAR\"
;
ANTLR3 3.1.3说:
syntax error: antlr: t.g:12:5: unexpected token: \'NVARCHAR\'
这怎么了我从这篇文章中学到了。
ps。稍后我将使用此语法,以使它脱离AST。检索到AST之后,我将遍历它,并将每个令牌的文本添加到某个字符串缓冲区中。上面重写的想法是替换某些令牌。我正在做语言到语言的映射(具体来说是从SQL到SQL的方言)。
解决方法
请注意,第一句话Terence开头为:““关于语义规则规范语言的一些不错的主意...”。那就是第一个例子:一个想法。这是无效的语法。
您至少有两个选择:
1.立即重写令牌中的文本
grammar T;
options{
output=AST;
}
@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream(\"NVARCHAR\"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}
type
: NVARCHAR {System.out.println(\"token=\" + $NVARCHAR.text);}
;
NVARCHAR
: \'NVARCHAR\' {setText(\"VARCHAR\");}
;
但这只会调整令牌的text
,而不是type
,而令牌仍是NVARCHAR
类型。
2.使用虚构的令牌:
grammar T;
options{
output=AST;
}
tokens {
VARCHAR=\'VARCHAR\';
}
@parser::members {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream(\"NVARCHAR\"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.type();
}
}
type
: NVARCHAR -> VARCHAR
;
NVARCHAR
: \'NVARCHAR\'
;
这会更改令牌的text
和type
。
如您所见,在两个演示中,,9都被打印到控制台上:
bart @ hades:〜/编程/ ANTLR / Demos / T $ java -cp antlr-3.3.jar org.antlr.Tool T.g
bart @ hades:〜/编程/ ANTLR / Demos / T $ javac -cp antlr-3.3.jar * .java
bart @ hades:〜/编程/ ANTLR / Demos / T $ java -cp。:antlr-3.3.jar TParser
令牌= VARCHAR
, 在antlr4中,可以通过type
动作来替换文本和类型:
OldTokenType:
(\'Token1\' | \'Token2\' | \'Token3\' ) {setText(\"New Token\");}
-> type(NewTokenType);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。