[英]\[$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狀態機總體如何處理此狀態。
default
表示“其他”,而不是“所有”。 換句話說,您首先填寫指定的操作,然后對其他任何超前符號使用默認操作。
如果沒有默認操作,則任何未指定的超前符號的操作都是錯誤。 默認的reduce動作通常用於減小表的大小,否則該算法會觸發錯誤。 此優化可能會導致延遲報告錯誤,但總會在消耗另一個輸入之前檢測到錯誤,這恰恰是因為錯誤操作永遠不會被默認移位替換。 (實際上,許多解析器生成器根本不使用默認的shift操作。)
如果查看.output
文件開頭顯示的語法,您會發現它已經隨着生產而得到增強:
0 $accept: input $end
Yacc /野牛總是添加這樣的生產,以確保完整的輸入匹配開始符號。 (當然,非終止input
將被%start
指令或語法中第一個非終止聲明的起始符號代替。)
除了減少$accept
符號會導致輸入被接受之外,此規則沒有什么特別的。 (您可以在狀態4中看到它)。
$end
是檢測到EOF時自動生成的特殊終端符號。 (更確切地說,它是令牌值為0的終端,掃描程序將其返回以指示文件結尾:(f)lex生成的掃描程序會自動執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.