为什么我的ANTLR语法无法匹配?

时间:2014-01-28 02:10:30

标签: antlr antlr4

我的语法如下:

grammar BirdGrammar;


lines: (init '\n')*;
init  : lineCode
      | continuation;

sep : ' '
    | '-'
    ;


lineCode  : interfaceList
          | protocolList
          | interfaceAddress
          | interfaceFlags
          ;

interfaceList     : '1001' sep INTERFACENAME ' ' interfaceStatus ' (index=' index ')';
protocolList      : '1002';
interfaceAddress  : '1003';
interfaceFlags    : '1004';
continuation      : ' ';

interfaceStatus   : 'up'
                  | 'DOWN';

index         : INDEX;
INTERFACENAME : [a-zA-Z0-9]+;
INDEX         : [0-9]+;

我正在尝试将以下输入数据(通过grun)提供给它:

1001-eth0 up (index=110)
1001-ip6gre0 DOWN (index=113)

当我这样做时,我会收到以下错误:

line 1:20 mismatched input '110' expecting INDEX
line 2:25 mismatched input '113' expecting INDEX

现在,我认为INDEX(规则)应匹配110和113,因为它正在寻找重复[0-9] +。有没有人发现我的语法或输入有任何明显的问题?

2 个答案:

答案 0 :(得分:0)

您的词法分析器规则INTERFACENAME与输入110匹配。由于该规则位于语法INDEX之前,因此始终优先。事实上,这个语法永远不会以当前形式生成INDEX令牌,因为INTERFACENAME将始终与索引匹配。

另请注意,由于在解析器规则中包含文字'1001',输入1001将始终是其自己的唯一标记,永远不是INTERFACENAME或{{1 }}。这同样适用于INDEX10021003

答案 1 :(得分:0)

INTERFACENAME可以用数字角色开头吗?如果没有,请尝试以下方法: INTERFACENAME:([a-zA-Z])([a-zA-Z0-9])*;