我有以下简单的ANTLR语法:
<ctrb ctrb-type="edit">
当我尝试解析字符串&#34;网页 - &gt;谷歌搜索&#34;,我收到错误:
grammar Grammar;
grammarRules : grammarRule+ ;
grammarRule:
lhs '->' WORD+
;
lhs: ID ;
WORD : LETTER+ ;
ID : LETTER (LETTER|'0'..'9')* ;
fragment
LETTER : [a-zA-Z\u0080-\u00FF_] ;
WS : [ \t] -> skip ;
答案 0 :(得分:0)
你的语法坏了。 WORD
的定义与webpage
匹配。这是词法分析器返回的内容,因此解析器抱怨没有看到ID
。
如果您尝试解析webpage1 -> google search
它应该有效,因为webpage1
不是WORD
。
语法不是LL(*)。鉴于例如输入a - &gt; b c d - &gt;例如,解析器需要向前看第二个->
,以便将信息反馈给词法分析器,从而将d
识别为ID
而不是WORD
。安特尔不会这样做。 (你可能不会想要它,因为这可能会复杂化并因此大大减慢词法分析器。)
您可以通过在您的语言中添加新行或分号等语句终止符来解决问题。