为什么 ANTLR 无法识别我的数字标记

问题描述 投票:0回答:1

我是一名 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 标记(在限定符中)会捕获具有多个数字的完整数值,但事实并非如此。它也不适用于单个数字。 :

antlr antlr4
1个回答
0
投票

如果您想继续识别除

NUMERAL
之外的
DECIMAL_NUMERAL
,请将
NUMERAL
移至
DECIMAL_NUMERAL
上方:

NUMERAL          : DIGIT+;
DECIMAL_NUMERAL  : NUMERAL ('.' NUMERAL)?;

ANTLR创建代币的方式如下:

  1. 选择与最多字符匹配的词法分析器规则
  2. 每当 2 个或更多规则匹配相同字符时,让第一个定义的规则“获胜”

因为像

"123"
这样的输入会同时匹配
DECIMAL_NUMERAL
NUMERAL
,所以顺序很重要。请注意,根据我的建议,输入
"123"
现在永远不会变成
DECIMAL_NUMERAL
,而始终是
NUMERAL
!如果您需要匹配解析器中的任何数字标记,请将两者合并为一个解析器规则:

number
 : DECIMAL_NUMERAL
 | NUMERAL
 ;
© www.soinside.com 2019 - 2024. All rights reserved.