2016-07-02 80 views
0

我有以下简单ANTLR语法:简单的语法无法解析

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 ; 

当我尝试解析字符串“网页 - >谷歌搜索”,我得到的错误:

line 1:0 mismatched input 'webpage' expecting ID 

回答

0

你的语法被破坏了。 WORD的定义匹配webpage。这就是词法分析器返回的结果,所以解析器抱怨没有看到ID

如果您尝试解析webpage1 -> google search它应该工作,因为webpage1不是WORD

语法不是LL(*)。鉴于例如输入a - > b c d - > e f时,语法分析器将需要向前看第二个->以便将信息反馈给词法分析器,导致将d识别为ID而不是WORD。 ANTLER不这样做。 (你可能不希望它,因为这可能会复杂化,并因此大大减慢词法分析器的速度。)

您可以通过在语言中添加语句终止符(如换行符或分号)来解决问题。

+0

好吧,看起来更大的一点是,词法分析器作为完全不同于解析器步骤的自己的层运行,因此词法分析器有责任确定在出现歧义时应该怎么做。在这方面,我很好奇为什么添加一个语句终结者来解决歧义问题。 –

+0

@DanielBigham你是对的。这可能还不够。你必须做一些事情,比如'lhs - > ID | WORD'。由于ANTLR解析器是LL(*),所以您可能不需要行终止符。 (如果他们只是LL(1)) – Gene

+0

对于后来可能会发现这种情况的其他人 - 我用Antlr拉着我的头发出现各种奇怪的行为,然后我读了一些关于重构我的语法的东西,以便主要语法包含在一个单一的规则中,而不是用不同的符号分解成许多规则。这显然可以使语法的左递归得到更好的处理。 Presto现在运行良好。 –