【问题标题】:antlr4 matches longest oneantlr4 匹配最长的一个
【发布时间】:2018-09-27 12:45:21
【问题描述】:

我尝试了一个 Antlr4 语法文件。当我更改 ID 属性的定义时

ID :[A-Z]+;

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

我收到了这个错误。

第 1:7 行不匹配的输入 'E550' 期望 {'W', 'I'}

第 1:12 行不匹配的输入 ';'期待 {'W', 'I'}

其实我知道原因。其中最长的数学。但我必须使用 ID Like 错误的方式。我的 foo 必须是 E 或 I 和 Number。我怎样才能让它发生?感谢任何帮助。

这是我的代码 sn-p 导致错误。

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: . ;

【问题讨论】:

  • QUEST E550 ; 无法被您发布的语法解析。但我可以做出有根据的猜测,您忘记在示例语法中添加 ERROR : 'E';

标签: parsing antlr4


【解决方案1】:

如果您的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) 
 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多