[英]Expression parser grammar and left-associativity
我一直在嘗試用變量創建我的解析器表達式,並將它們簡化為二次表達式。
這是我的解析器語法:
Exercise : Expr '=' Expr
Expr : Term [+-] Expr | Term
Term : Factor [*/] Term | Factor
Factor: Atom [^] Factor | Atom
Atom: Number | Identified | [- sqrt] Atom | '(' Expr ')'
對於解析我正在使用遞歸下降解析器。 我想說我想解析一下:
“2 - 1 + 1 = 0”
結果為0,解析器創建錯誤的樹:
-
/ \
2 +
/ \
1 1
我怎樣才能使這個語法保持聯想? 我是新手,請你告訴我哪里可以找到更多信息? 我可以用遞歸下降解析器實現這一點嗎?
看看Theodore Norvell的遞歸下降解析表達式
在那里,他提出了三種解決問題的方法。
1. 調車場算法。
2.通過分解語法的經典解決方案 。
3. 優先攀登
你的問題源於你的語法需要多次改變,一個例子就是
Exrp:Term {[+ - ] Expr} | 術語
注意在[+-] Expr
周圍添加{ }
表示它們應該被一起解析,並且可以有0個或更多。
此外,默認情況下,您將樹構建為
-
/ \
2 +
/ \
1 1
即-(2,+(1,1))
當你應該為具有相同優先級的左關聯運算符構建樹時
+
/ \
- 1
/ \
2 1
即+(-(2,1),1)
由於本文有三種方法可以做到這一點,所以我不會在這里進行擴展。 另外你提到你是新手,所以你應該得到一本好的編譯器書,以了解你將在閱讀論文時遇到的細節。 這些方法中的大多數都是以通用編程語言實現的,並且可以在互聯網上免費獲得,但要注意許多人會做你做的事情並發布錯誤的結果。
檢查你是否正確的最佳方法是使用多個減法操作序列進行這樣的測試:
7-3-2 = 2
如果你得到
7-3-2 = 6或其他
那是錯的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.