antlr4 匹配最长的一个

antlr4 matches longest one

我试试 Antlr4 语法文件。当我更改 ID 属性

的定义时
ID :[A-Z]+;

ID: [A-Z][A-Za-z0-9_]* ;

我遇到了这个错误。

line 1:7 mismatched input 'E550' expecting {'W', 'I'}

line 1:12 mismatched input ';' expecting {'W', 'I'}

其实我知道原因。哪个与最长的相符。但是我必须使用 ID Like 错误的方式。我的 foo 必须是 E 或 I 和 Number。我怎样才能让它发生?感谢您的帮助。

这是我导致错误的代码片段。

QUEST E550 ;

这是我的语法

grammar test;

block: foo+;
foo:ID op=(WARNING|INFORMATION)INT SCOL;
SCOL :';';
WARNING :'W';
INFORMATION :'I';
ID: [A-Z]+ ;
//if I change to ID: [A-Z][A-Za-z0-9_]* ; error occurs
INT : [0-9]+;
SPACE: [ \t\r\n] -> skip;
OTHER: . ;

如果您的 ID 规则不能以 WIE 开头,那么您需要从开头排除这些规则:

ID: [A-DF-HJ-VX-Z] [A-Za-z0-9_]* ;

当然,那么像EEEEE这样的输入就不会变成ID了。为了解决这种情况,您可以 (1) 让您的 ID 规则以除 WIE 以外的单个大写字母开头,然后是其余部分,或者 ( 2) 让它以 2 个字母开头,然后是其余字母:

ID
 : [A-DF-HJ-VX-Z] [A-Za-z0-9_]* // (1)
 | [A-Z] [A-Z] [A-Za-z0-9_]*    // (2) 
 ;