我是一名 ANTLR 新手;并尽最大努力提高技术水平。
我不明白为什么我定义为 NUMERAL 的令牌与数字不匹配。
我确信这对我来说是一些愚蠢的举动,但如果是其他事情(即规则的优先位置等),我绝对可以发布我的完整词法分析器,但这是我遇到问题的令牌:
DECIMAL_NUMERAL : NUMERAL ('.' NUMERAL)?;
NUMERAL : DIGIT+;
fragment DIGIT : [0-9];
我在 Antl4-lab 中使用的文本:
actions+=/car.shift,if=tachvalue>3300
这是完整的解析器;为了找到错误,我把它删减了不少:
parser grammar SimcParser;
options { tokenVocab = SimcLexer; }
profile :
(comment | action_base)*
EOF;
action_base :
( conditionalAction) NEWLINE;
comment : HASH SENTENCE NEWLINE;
actionpart : ACTIONS (DOT subName=IDENTIFIER)?;
conditionalAction :
actionpart
(OP_EQ | ASSIGN)
actionName=dotted_name
ACTIF
exp;
dotted_name :
IDENTIFIER (DOT IDENTIFIER)?;
eval :
BITWISE_OR | LT | GT | OP_EQ | OP_NOT | OP_LE | OP_GE;
exp :
propertyName=IDENTIFIER eval qualifier
;
qualifier :
NUMERAL;
以及我生成的带有错误的树。显然我错过了一些大事;因为我认为 NUMERAL 标记(在限定符中)会捕获具有多个数字的完整数值,但事实并非如此。它也不适用于单个数字。 :
如果您想继续识别除
NUMERAL
之外的 DECIMAL_NUMERAL
,请将 NUMERAL
移至 DECIMAL_NUMERAL
上方:
NUMERAL : DIGIT+;
DECIMAL_NUMERAL : NUMERAL ('.' NUMERAL)?;
ANTLR创建代币的方式如下:
因为像
"123"
这样的输入会同时匹配 DECIMAL_NUMERAL
和 NUMERAL
,所以顺序很重要。请注意,根据我的建议,输入 "123"
现在永远不会变成 DECIMAL_NUMERAL
,而始终是 NUMERAL
!如果您需要匹配解析器中的任何数字标记,请将两者合并为一个解析器规则:
number
: DECIMAL_NUMERAL
| NUMERAL
;