我試圖用Irony編寫一個小解析器。不幸的是,我得到了一個「減少衝突」的衝突。文法不是我的強項,我只需要完成這一件小事。這是產生錯誤的簡化文法:在我的語法中解決轉換 - 減少衝突的問題
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
「shift-reduce衝突」是什麼意思,我該如何解決它?我認爲這意味着我的語法是模糊的,但我不能充分扭曲我的邏輯來看看如何。
加:澄清 - 「asd」只是一個字符串「asd」。因此,我想到的是,下面的表達式是由這個語法解析:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
新增2:忘了說了,語法的根源是LogicalExpression
。
添加了3:啊,我明白了!歧義是因爲喜歡
asd AND asd OR asd
的表達可以有兩種不同的解釋:
(asd AND asd) OR asd
asd AND (asd OR asd)
但我怎麼能解決這個問題?好的,我可以把AND和OR中的一個比另一個更強大(無論如何我都會這樣做)。但是現在我發現即使只有一個操作員也會出現錯誤。換句話說,這也產生了同樣的錯誤:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
在這種情況下,我想這一點:
asd OR asd OR asd
被解析到這一點:
(asd OR asd) OR asd
什麼是無曖昧的做法呢?
加了4個: Got it!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
這將解析所有布爾表達式,運算符優先級爲NOT-> AND-> OR。 「asd」可以替換爲用於您的術語的表達式。
嘿,想起來了,我開始記住這個我在大學期間的模式。 :D –