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
规则不能以 W
、I
或 E
开头,那么您需要从开头排除这些规则:
ID: [A-DF-HJ-VX-Z] [A-Za-z0-9_]* ;
当然,那么像EEEEE
这样的输入就不会变成ID
了。为了解决这种情况,您可以 (1) 让您的 ID
规则以除 W
、I
或 E
以外的单个大写字母开头,然后是其余部分,或者 ( 2) 让它以 2 个字母开头,然后是其余字母:
ID
: [A-DF-HJ-VX-Z] [A-Za-z0-9_]* // (1)
| [A-Z] [A-Z] [A-Za-z0-9_]* // (2)
;
我试试 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
规则不能以 W
、I
或 E
开头,那么您需要从开头排除这些规则:
ID: [A-DF-HJ-VX-Z] [A-Za-z0-9_]* ;
当然,那么像EEEEE
这样的输入就不会变成ID
了。为了解决这种情况,您可以 (1) 让您的 ID
规则以除 W
、I
或 E
以外的单个大写字母开头,然后是其余部分,或者 ( 2) 让它以 2 个字母开头,然后是其余字母:
ID
: [A-DF-HJ-VX-Z] [A-Za-z0-9_]* // (1)
| [A-Z] [A-Z] [A-Za-z0-9_]* // (2)
;