2012-09-30 42 views
0

我正在爲類似於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」放入減速器?

回答

0

我懷疑,而不是切換策略的「個人陳述」,你最好只做表達式。這樣你就不需要從流中取出固定數量的令牌;你只要簡單地把你的語法定義爲一個表達式作爲一個原子單位,然後傳遞給你的子分析器。