我的语法如下:
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] +。有没有人发现我的语法或输入有任何明显的问题?
答案 0 :(得分:0)
您的词法分析器规则INTERFACENAME
与输入110
匹配。由于该规则位于语法INDEX
之前,因此始终优先。事实上,这个语法永远不会以当前形式生成INDEX
令牌,因为INTERFACENAME
将始终与索引匹配。
另请注意,由于在解析器规则中包含文字'1001'
,输入1001
将始终是其自己的唯一标记,永远不是INTERFACENAME
或{{1 }}。这同样适用于INDEX
,1002
和1003
。
答案 1 :(得分:0)
INTERFACENAME可以用数字角色开头吗?如果没有,请尝试以下方法: INTERFACENAME:([a-zA-Z])([a-zA-Z0-9])*;