Antlr 我的语法标识符关键字作为标识符

Antlr 我的语法标识符关键字作为标识符,antlr,antlr4,Antlr,Antlr4,我试图解析雅加达表达式语言中的表达式。总之,它是一个简化的Java表达式,并添加了一些内容: 支持创建地图,如:{“foo”:“bar} 支持创建列表和集合,如:[1,2,3,4]{1,2,3,4} 使用一些标识符而不是符号,例如:foo gt bar(foo>bar),foo mod bar(foo%bar),等等 我在最后一点上苦苦挣扎,它总是将“mod”、“gt”、“ge”理解为标识符,而不是使用带有“%”、“>”、“>=”的表达式 我是ANTLR的新手。我的语法基于中的Java语法和

我试图解析雅加达表达式语言中的表达式。总之,它是一个简化的Java表达式,并添加了一些内容:

  • 支持创建地图,如:
    {“foo”:“bar}
  • 支持创建列表和集合,如:
    [1,2,3,4]
    {1,2,3,4}
  • 使用一些标识符而不是符号,例如:
    foo gt bar
    foo>bar
    ),
    foo mod bar
    foo%bar)
    ,等等
我在最后一点上苦苦挣扎,它总是将“mod”、“gt”、“ge”理解为标识符,而不是使用带有“%”、“>”、“>=”的表达式

我是ANTLR的新手。我的语法基于中的Java语法和以下提供的JavaCC:

语法表达语言语法; prog:复合表达; 复合表达:(动态表达|延迟表达|文字表达)*; dynamicExpression:“${”表达式RCURL; deferredExpression:“#{”表达式RCURL; 文字表达:文字; literal:BOOL_literal |浮点| literal |整数| literal | StringLiteral | NULL; mapData | listData | setData; 方法参数:LPAREN expressionList?RPAREN; 表达式列表:(表达式((逗号表达式)*); lambdaExpressionOrCall:LPAREN lambdaExpression RPAREN methodArguments*; lambdaExpression:lambdaParameters箭头表达式; lambdarameters:IDENTIFIER |(LPAREN(IDENTIFIER((逗号标识符)*))?RPAREN); mapEntry:表达式冒号表达式; 地图条目:地图条目(逗号地图条目)*; 表达 :主要 |“['表达式列表?'” |“{”表达式列表?}” |“{”映射条目?}” |表达式bop='。(标识符|标识符'('expressionList?')) |表达式('['表达式']')+ |前缀=(“-”|“!”| NOT1|空)表达式 |表达式bop=(“*”|“/”|“%”表达式 |表达式bop=(“+”|“-”)表达式
|表达式bop=(“=”|“>”|“将它们的词法规则移动到
标识符的词法规则之前

如果ANTLR有多个Lexer规则匹配相同长度的输入,它将选择语法中匹配的第一个规则

例如,“mod”由
Identifier
MOD1
匹配,但是
Identifier
是第一位,所以它选择
Identifier
。将
MOD1
规则移动到
Identifier
之前,它将匹配
MOD1

----

顺便说一句,除非您关心“%”和“mod”具有不同的令牌值,否则您可以只定义一个规则:

MOD: ‘%’ | ‘mod’;

如果您需要,您仍然可以获得令牌文本,但它会,您可以在解析器规则中指定
MOD
,而不是
(MOD0 | MOD1)

非常感谢您,您不知道我在这方面花了多少时间。
MOD: ‘%’ | ‘mod’;