2011-04-10 59 views
0

我无法理解YACC的转换/减少冲突问题。有人可以解决这个问题,并使用dangling-else例子向我解释这个问题吗?转换减少冲突

谢谢!

回答

1

悬挂其他问题的基本含义是这样的:

if (x) then if (y) then a; else b; 

可被分析为要么

if (x) then { 
    if (y) { 
     then a; 
     else b; 
    } 
} 

if (x) then { 
    if (y) 
     then a; 
} 
else b; 

大多数语言要求第一个 - 和这正是yacc所做的,所以它很少是一个真正的问题(事实上,yacc的S/R冲突很少是m关心的问题)。

+0

无论他们是否担心,只有在了解它是什么以及它为什么出现在语法中的特定位置后才能说出。 LadyMadonne234试图理解它真的很好。 – Ingo 2011-04-10 20:55:19

+0

@Ingo:哦,对此我没有任何争论。我只是注意到(例如)决定试图从语法中摆脱所有的S/R冲突,这是很不值得的。 – 2011-04-10 20:57:57

+0

谢谢,这很清楚问题是什么。但是,你能否解释下面显示的改进语法如何解决问题? 'full_if:something | IF expression THEN full_if ELSE full_if ; open_if:IF expression THEN语句 | IF表达式然后full_if ELSE open_if ;' 所以在堆栈中,如果你有一个语句,如“如果A然后如果B然后C否则D” - 对我来说,它仍然看起来像你有同样的问题......即,如果你在“如果A然后如果B然后C”并且你看到一个Else到来,你仍然可以使用open_if规则的第一部分减少对吗? – LadyMadonna234 2011-04-10 21:08:16