2017-05-08 58 views
0

我目前使用happy來解析語言,但我不認爲解析器是相關的,只是說它是一個LALR解析器。這裏是從語法的一小部分摘錄:使用括號和不同類型的表達式進行解析

ArithExpr -> ArithExpr + ArithExpr 
ArithExpr -> (ArithExpr) 
ArithExpr -> ... 

BoolExpr -> ArithExpr == ArithExpr 
BoolExpr -> (BoolExpr) 
BoolExpr -> ... 

問題是,我得到減少減少衝突。我想,當我試圖解析類似下面的問題出現了:

((2 + 3) == (4 + 5)) 

只有一種解析這個表達方式,但問題是,我認爲即使在解析器開始有一些麻煩,第一個括號。我認爲這種情況的原因是,該分析器不知道是否它面臨ArithExpr或在未來BoolExpr,並且因爲它是隻得到了超前的一個標記它使這可能是錯誤的任意選擇。

反正是有重寫語法接受這種語言?或者我應該真的只是來解析這兩個ArithExprBoolExpr就像一個統一的Expr和類型檢查期間與實際類型處理?

回答

1

你應該只解析Expr,做類型語義分析期間檢查。否則,你將有真的很難對付任何括號表達式(你不能告訴他們是什麼類型的,直到爲時已晚)或一流的布爾值(一個變量可能有一個布爾值,不是嗎?)。

參見my answer here一種替代(但它最終給予同樣的建議);我只是提供了完整性的鏈接,只是因爲我確實不相信這個答案中描述的技術的價值,但我認爲它與不同的LALR解析器生成器本質上是相同的問題。