簡體   English   中英

\\ [$ end \\]在LALR中超前

[英]\[$end\] lookaheads in LALR

我想了解一下,野牛如何為這種簡單的語法建立表格:

input: rule ;
rule: rule '+' '1' 
    | '1' ;

我能夠計算LR(1)轉換表和項目集,但我不了解狀態3的構建和工作方式:

State 3

1 input: rule .  [$end]
2 rule: rule . '+' '1'

'+'  shift, and go to state 5

$default  reduce using rule 1 (input)

對於默認的減少規則,我應該將“ r1”放入每個符號的GOTO表的所有單元格中。 但是對於移位規則,我應該將“ s5”放入“ +”終端的列中(此單元格已經包含“ r1”)。 對我來說,這看起來像是轉移/減少沖突。 但不是野牛。 請說明“ [$ end]” 超前符號如何在此狀態下出現,以及LR狀態機總體如何處理此狀態。

  1. default表示“其他”,而不是“所有”。 換句話說,您首先填寫指定的操作,然后對其他任何超前符號使用默認操作。

    如果沒有默認操作,則任何未指定的超前符號的操作都是錯誤。 默認的reduce動作通常用於減小表的大小,否則該算法會觸發錯誤。 此優化可能會導致延遲報告錯誤,但總會在消耗另一個輸入之前檢測到錯誤,這恰恰是因為錯誤操作永遠不會被默認移位替換。 (實際上,許多解析器生成器根本不使用默認的shift操作。)

  2. 如果查看.output文件開頭顯示的語法,您會發現它已經隨着生產而得到增強:

     0 $accept: input $end 

    Yacc /野牛總是添加這樣的生產,以確保完整的輸入匹配開始符號。 (當然,非終止input將被%start指令或語法中第一個非終止聲明的起始符號代替。)

    除了減少$accept符號會導致輸入被接受之外,此規則沒有什么特別的。 (您可以在狀態4中看到它)。

    $end是檢測到EOF時自動生成的特殊終端符號。 (更確切地說,它是令牌值為0的終端,掃描程序將其返回以指示文件結尾:(f)lex生成的掃描程序會自動執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM