这是我的树语法:
grammar t;
options{
output = AST;
}
type
:
'NVARCHAR' -> "VARCHAR"
;
ANTLR3 3.1.3说:
syntax error: antlr: t.g:12:5: unexpected token: 'NVARCHAR'
怎么了我从this article那里拿走的。
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
。如您所见,在两个演示中,
token=VARCHAR
都被打印到控制台: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