Parsing ANTLR:对空格敏感的解析器规则
我有以下输入数据:Parsing ANTLR:对空格敏感的解析器规则,parsing,antlr,grammar,antlr3,Parsing,Antlr,Grammar,Antlr3,我有以下输入数据: Valid string: "123A" Invalid string: "123 A" Valid string: "111A <= 5 AND 222A" Invalid string: "111 A <= 5 AND 222A" 问题是my_id与123A和123A都匹配。当检测到123 a时,如何抛出解析错误 非常感谢您的帮助。您确定123 A被评估为my_id而不是INT和其他内容吗?由于INT标记不是一个片段,如果您有一个接受a的规则,它可能会以这
Valid string: "123A"
Invalid string: "123 A"
Valid string: "111A <= 5 AND 222A"
Invalid string: "111 A <= 5 AND 222A"
问题是my_id
与123A
和123A
都匹配。当检测到123 a
时,如何抛出解析错误
非常感谢您的帮助。您确定
123 A
被评估为my_id
而不是INT
和其他内容吗?由于INT
标记不是一个片段,如果您有一个接受a
的规则,它可能会以这种方式进行计算,那么使用另一个lexer项不是更容易吗。像INTA:DIGIT+('A'|'A')代码>。如果在另一个上下文中使用后跟“A”的数字,这只会导致问题。@Benlitz我忘了指定WS
,这是使语法忽略空格的lexer规则@StefanA我怎么还能将INTA转换为INT(my_id:INTA->INT;
)?对于123A
我只对保留123
和修剪字母感兴趣。您可以在lexer规则(或解析器规则/在操作中/在树构造中)中设置标记类型和标记文本。
my_id: INT ('A'|'a') -> INT;
fragment DIGIT: '0' .. '9';
INT : DIGIT+ ;
WS : (' '|'\t'|'\n'|'\r')+ {$channel=HIDDEN;} ;