2016-04-10 86 views
0

我想這個語法轉化爲明確的語法:是這個語法歧義

S -> if E then S 
    | if E then S else S 
    | a 
E -> b 

我發現了一個解決方案,它比我的解決方案比較複雜,但我不知道如果我的解決辦法是正確的:

S -> if E then T else S 
    | if E then S 
    | a 
T -> if E then T else T 
    | a 
E -> b 

那麼我的解決方案是否正確?

回答

1

它看起來對我很好。這真的不是太大的標準解決方案不同:

stmt  : matched | unmatched 
matched : "if" expr "then" matched "else" matched 
      | other_stmt 
unmatched : "if" expr "then" unmatched 
      | "if" expr "then" matched "else" unmatched 

的標準解決方案的優點是other_stmta在你的語法)不重複,和語法更容易與其他複合語句擴展。例如,如果我們添加while聲明:

stmt  : matched | unmatched 
matched : "if" expr "then" matched "else" matched 
      | "while" matched 
      | other_stmt 
unmatched : "if" expr "then" unmatched 
      | "if" expr "then" matched "else" unmatched 
      | "while" unmatched