在ANTLR语法中使用不同的大小写关键字

在ANTLR语法中使用不同的大小写关键字,antlr,Antlr,语法中的一些关键字(字符串常量)包含大写字母 e、 g 这会导致奇怪的解析行为:包含相同大写字母('p','V')的其他标记解析不正确 以下是lexer语法的简化版本: lexer grammar ExpressionLexer; COMMA : ','; LPAREN : '('; RPAREN : ')'; LBRACK : '['; RBRACK : ']'; PLUS : '+'; MINUS : '-'; MULT : '*'; DIV : '/'; PREV_VALUE : 'Pr

语法中的一些关键字(字符串常量)包含大写字母 e、 g

这会导致奇怪的解析行为:包含相同大写字母('p','V')的其他标记解析不正确

以下是lexer语法的简化版本:

lexer grammar ExpressionLexer;

COMMA : ',';
LPAREN : '(';
RPAREN : ')';
LBRACK : '[';
RBRACK : ']';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
PREV_VALUE : 'PreviousValue';
fragment DIGIT : ('0'..'9');
fragment LETTER : ('a'..'z'|'A'..'Z'|'_');
fragment TAB : ('\t') ;
fragment NEWLINE : ('\r'|'\n') ;
fragment SPACE : (' ') ;
当我尝试解析此类表达式时:

var expression = "P"; //Capital 'P' which included to the keyword 'PreviousValue'
var stringReader = new StringReader(expression);
var input = new ANTLRReaderStream(stringReader);
var expressionLexer = new ExpressionLexer(input);
var tokens = new CommonTokenStream(expressionLexer);
tokens.\u tokens
集合包含一个值

[0] = {[@0,1:1='<EOF>',<-1>,1:1]}
没错

当字符串
PREV_值时:“PreviousValue”已从语法中删除,两个表达式都已正确解析

是否可以在关键字中使用不同的大小写?
在ANTLR语法中有使用此类关键字的例子吗?

我发现很难相信
p
标记是根据您发布的语法创建的。前面有
fragment
的Lexer规则将不会生成令牌:这些规则仅由其他Lexer规则使用

一个简单的演示展示了这一点:

lexer grammar ExpressionLexer;

@lexer::members {
  public static void main(String[] args) throws Exception {
    ExpressionLexer lexer = new ExpressionLexer(new ANTLRStringStream(args[0]));
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    tokens.fill(); // remove this line when using ANTLR 3.2 or an older version
    System.out.println(tokens);
  }
}

COMMA : ',';
LPAREN : '(';
RPAREN : ')';
LBRACK : '[';
RBRACK : ']';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
PREV_VALUE : 'PreviousValue';
fragment DIGIT : ('0'..'9');
fragment LETTER : ('a'..'z'|'A'..'Z'|'_');
fragment TAB : ('\t') ;
fragment NEWLINE : ('\r'|'\n') ;
fragment SPACE : (' ') ;
现在生成lexer并编译
.java
源文件:

java -cp antlr-3.3.jar org.antlr.Tool ExpressionLexer.g javac -cp antlr-3.3.jar *.java
这是正确的,因为以
“p”
开头的唯一(非片段)规则要求
“r”
作为下一个字符(不在那里)。

很抱歉我编辑了我的第一篇文章。希望能澄清。谢谢你的解释!现在我明白我的错误了。我所需要做的就是为单词(没有片段)添加新的lexer规则,以生成正确的标记。
lexer grammar ExpressionLexer;

@lexer::members {
  public static void main(String[] args) throws Exception {
    ExpressionLexer lexer = new ExpressionLexer(new ANTLRStringStream(args[0]));
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    tokens.fill(); // remove this line when using ANTLR 3.2 or an older version
    System.out.println(tokens);
  }
}

COMMA : ',';
LPAREN : '(';
RPAREN : ')';
LBRACK : '[';
RBRACK : ']';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
PREV_VALUE : 'PreviousValue';
fragment DIGIT : ('0'..'9');
fragment LETTER : ('a'..'z'|'A'..'Z'|'_');
fragment TAB : ('\t') ;
fragment NEWLINE : ('\r'|'\n') ;
fragment SPACE : (' ') ;
java -cp antlr-3.3.jar org.antlr.Tool ExpressionLexer.g javac -cp antlr-3.3.jar *.java java -cp .:antlr-3.3.jar ExpressionLexer p line 1:0 no viable alternative at character 'p' java -cp .:antlr-3.3.jar ExpressionLexer P line 1:1 mismatched character '' expecting 'r'