我正在爲類似於C#的語言創建解析器,並且決定自頂向下和自下而上的組合是最好的。基本上,我想使用自頂向下的解析,除了個別語句。其原因在於操作順序 - 它以自下而上的方式實現它們更容易,並且使用自頂向下的解析器實現其他任何操作都容易得多。結合自頂向下和自下而上的解析
這個的實際實現如下:以自頂向下解析開始,匹配正常。然後,在其中一條規則中,有一條規則標記爲「自下而上」。 X
令牌被從輸入lex數組中取出,「自底向上」(又名shift-reduce)「嘎吱嘎吱」成單個令牌,並且該令牌被放置在自上而下的匹配中。自上而下繼續其餘的比賽。
我的問題是如何得到這個號碼X
。我可以從輸入令牌流中取出多少個令牌來進行shift-reduce?我的初始解決方案很簡單 - 直到達到分號爲止。然而,如果陳述的事情呢?這些表達式的末尾沒有分號。
我舉一個例子來說明我原來的計劃,因爲它可能聽起來像是胡言亂語。說設置語法如下:
(top-down) statement ::= <expression> ";"
(bottom-up) expression =
multiplication ::= <number> "*" <number>
addition ::= <number> "+" <number>
然後,它會降低像這樣:
3 + 4 * 2 ;
((bottom-up) 3 + 4 * 2) ;
3 + 4 * 2
3 + multiplication
addition
addition ;
statement
我的問題,再次是怎麼做的,我得到令牌的數量轉移,降低?我怎麼知道我想把所有的「3 + 4 * 2」放入減速器?