2012-09-08 59 views
6

這比一個實際的問題更像是一個「原則上」的問題。是Yacc減少生產的順序,並從定義的詞法分析器中讀取新的標記。也就是說,如果我有以下設置令牌:是否在Yacc中定義了約簡的順序?

INTEGER_BEGIN 
INTEGER_VALUE 
LESS_THAN 
INTEGER_BEGIN 
INTEGER_VALUE 

能Yacc的,它的語義中,讀取來自詞法分析器的LESS_THAN令牌,它給定一組作品的降低INTEGER BEGIN INTEGER_VALUE前一個單一的東西,:

expr : expr LESS_THAN expr 
    | integer 

integer : INTEGER_BEGIN INTEGER_VALUE 

如果這些變化是通過語義動作定義的,請執行此更改的規則嗎?

回答

4

是的,它可以。 Yacc創建一個LALR(1)解析器 - (1)意味着先行令牌 - 所以它可以在減少該規則之前先讀取超過令牌末尾的1個令牌。語義動作的存在是無關緊要的,因爲語義動作只是在減少規則之前運行的一些C代碼。

請注意,不能保證它總是預讀令牌。由yacc或bison創建的解析器有時使用「默認縮減」 - 指出它可以減少規則的位置,而不必先讀取下一個標記。只要減少規則與下一個標記無關,就會發生這種情況。

在這個特定的例子中,integer規則可以使用默認的縮減,所以它可能會在沒有前瞻的情況下減少它,但是也不能保證 - 默認減少是一些(但不是全部) YACC。

+0

有什麼方法可以知道這是否發生? –

+0

http://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html包含默認縮減的語義的完整描述,並且,正如您注意到的,會導致詞法分析器的延遲調用。 –

+0

在一些野牛版本中,你可以在動作中檢查'if(yychar == YYEMPTY)',看看你是否處於默認縮減(所以沒有讀過預讀),但這不是非常便攜的。 –

相關問題