2014-09-21 65 views
0

我正在与野牛语法首次广泛合作。我有我的语法设置和一个测试套件来关联结果。野牛语法偶尔会通过,偶尔会失败

有时,测试套件通过:

Reducing stack by rule 101 (line 613): 
    $1 = nterm mathenv() 
-> $$ = nterm closedTerm() 
Stack now 0 5 3 
Entering state 120 
Reading a token: Next token is token ENDMATH() 
Reducing stack by rule 28 (line 517): 
    $1 = nterm closedTerm() 
-> $$ = nterm compoundTerm() 
Stack now 0 5 3 
Entering state 119 
Reducing stack by rule 12 (line 333): 
    $1 = nterm compoundTerm() 
-> $$ = nterm compoundTermList() 
Stack now 0 5 3 
Entering state 198 
Next token is token ENDMATH() 
Shifting token ENDMATH() 
Entering state 325 

... continues to completion ... 

偶尔,它不:

Reducing stack by rule 101 (line 613): 
    $1 = nterm mathenv() 
-> $$ = nterm closedTerm() 
Stack now 0 5 3 
Entering state 120 
Reading a token: Next token is token MN() 
Reducing stack by rule 28 (line 517): 
    $1 = nterm closedTerm() 
-> $$ = nterm compoundTerm() 
Stack now 0 5 3 
Entering state 119 
Reducing stack by rule 12 (line 333): 
    $1 = nterm compoundTerm() 
-> $$ = nterm compoundTermList() 
Stack now 0 5 3 
Entering state 198 
Next token is token MN() 
Shifting token MN() 
Entering state 11 

... errors eventually ... 

Now at end of input. 
Line: 9 Error: syntax error at token 

ENDMATH是正确的令牌转移到,但有时,MN被确定。每当我运行我的测试时,都会得到不一致的结果。这种“随机”歧义是否正常?什么可能导致它?我应该定义一些%precedence规则吗?

截至y.output上,我看到几个矛盾的状态,像

State 0 conflicts: 3 shift/reduce 
State 120 conflicts: 2 shift/reduce 
State 127 conflicts: 2 shift/reduce 
State 129 conflicts: 2 shift/reduce 
State 154 conflicts: 1 shift/reduce 
State 207 conflicts: 3 shift/reduce 
State 265 conflicts: 109 shift/reduce 
State 266 conflicts: 109 shift/reduce 
State 267 conflicts: 109 shift/reduce 
State 268 conflicts: 109 shift/reduce 
State 269 conflicts: 109 shift/reduce 
State 342 conflicts: 2 shift/reduce 
State 390 conflicts: 109 shift/reduce 
State 391 conflicts: 109 shift/reduce 
State 396 conflicts: 1 shift/reduce 
State 397 conflicts: 1 shift/reduce 

是否可取消除所有这些冲突?注意,状态120被列为具有冲突,并且是在该随机错误发生之前的状态。

+0

词法分析器确定哪些标记被识别 - 解析器只使用这些标记。如果您从词法分析器中获得不一致的令牌,那么这对于词法分析器来说是一个问题,并且分析器是无关紧要的。 – 2014-09-21 22:03:57

回答

2

语法冲突意味着语法不是LALR(1)。这可能是由于语法不明确或者可能是由于语法需要超过一个前瞻标记。无论何时出现冲突,野牛都会根据您拥有的优先级指令选择可能的操作之一(或者移位或者减少)来解决它。这导致解析器识别(解析)由语法描述的语言的一些子集。

如果冲突纯粹是由于歧义造成的,那么这可能会导致消除模糊的分析,而实际上并没有真正减少语言。对于这种情况,使用优先规则解决歧义问题是解决问题的正确方法,因为它为您提供了解析所需语言的语法。

如果冲突是由于需要更多预测,优先规则通常没有帮助。您需要通过重新排列语法来解决这个问题,不要求先行或使用其他技术(黑客),例如让词法分析器根据输入或其他信息中的进一步前瞻插入额外的合成令牌。

在你的情况下,眼前的问题似乎是在词法分析器 - 在它返回标记ENDMATH的情况下,在另一个它返回MN。与y.output中看到的冲突有关的语法中可能还存在模糊或前瞻性问题,但这些问题乍一看完全独立于词法分析器的问题。

+0

在经历了许多令人烦恼的时间之后,我在代码中早些时候将问题追踪到了一个有弹性的'memmove'调用。虽然你的具体答案并没有解决这个问题 - 没有看整个文件,我不确定谁能 - 但它*帮助我理解Bison解析更好一点,为此我感激不尽。 – GJTorikian 2014-09-23 02:17:48