2015-11-03 87 views
3

我試圖使用檸檬分析器生成器生成分析器表,但運行lemon grammar.y時生成的.out文件僅包含自動機的狀態。從檸檬語法分析器生成器生成LR分析表

有沒有辦法讓非終端的goto表,不僅是自動機的狀態? 或者這隻能通過讀取生成的代碼來完成? 是否有其他工具可以生成動作和goto表?

PS:

.out文件(由檸檬產生)爲一個簡單的語法看起來像這樣:

State 0: 
      start ::= * e 
      e ::= * e PLUS t 
      e ::= * t 
      t ::= * t MUL f 
      t ::= * f 
      f ::= * LPAR e RPAR 
      f ::= * ID 

          LPAR shift  1  
          ID shift  4  
         start accept 
          e shift  11  
          t shift  6  
          f shift  5  

State 1: 
      e ::= * e PLUS t 
      e ::= * t 
      t ::= * t MUL f 
      t ::= * f 
      f ::= * LPAR e RPAR 
      f ::= LPAR * e RPAR 
      f ::= * ID 

          LPAR shift  1  
          ID shift  4  
          e shift  10  
          t shift  6  
          f shift  5  

State 2: 
      e ::= e PLUS * t 
      t ::= * t MUL f 
      t ::= * f 
      f ::= * LPAR e RPAR 
      f ::= * ID 

          LPAR shift  1  
          ID shift  4  
          t shift  9  
          f shift  5  

State 3: 
      t ::= t MUL * f 
      f ::= * LPAR e RPAR 
      f ::= * ID 

          LPAR shift  1  
          ID shift  4  
          f shift  8  

State 4: 
     (6) f ::= ID * 

          $ reduce  6  f ::= ID 
          PLUS reduce  6  f ::= ID 
          MUL reduce  6  f ::= ID 
          RPAR reduce  6  f ::= ID 

State 5: 
     (4) t ::= f * 

          $ reduce  4  t ::= f 
          PLUS reduce  4  t ::= f 
          MUL reduce  4  t ::= f 
          RPAR reduce  4  t ::= f 

State 6: 
     (2) e ::= t * 
      t ::= t * MUL f 

          $ reduce  2  e ::= t 
          PLUS reduce  2  e ::= t 
          MUL shift  3  
          RPAR reduce  2  e ::= t 

State 7: 
     (5) f ::= LPAR e RPAR * 

          $ reduce  5  f ::= LPAR e RPAR 
          PLUS reduce  5  f ::= LPAR e RPAR 
          MUL reduce  5  f ::= LPAR e RPAR 
          RPAR reduce  5  f ::= LPAR e RPAR 

State 8: 
     (3) t ::= t MUL f * 

          $ reduce  3  t ::= t MUL f 
          PLUS reduce  3  t ::= t MUL f 
          MUL reduce  3  t ::= t MUL f 
          RPAR reduce  3  t ::= t MUL f 

State 9: 
     (1) e ::= e PLUS t * 
      t ::= t * MUL f 

          $ reduce  1  e ::= e PLUS t 
          PLUS reduce  1  e ::= e PLUS t 
          MUL shift  3  
          RPAR reduce  1  e ::= e PLUS t 

State 10: 
      e ::= e * PLUS t 
      f ::= LPAR e * RPAR 

          PLUS shift  2  
          RPAR shift  7  

State 11: 
     (0) start ::= e * 
      e ::= e * PLUS t 

          $ reduce  0  start ::= e 
          PLUS shift  2  

---------------------------------------------------- 
Symbols: 
    0: $: 
    1: PLUS 
    2: MUL 
    3: LPAR 
    4: RPAR 
    5: ID 
    6: error: 
    7: start: LPAR ID 
    8: e: LPAR ID 
    9: t: LPAR ID 
    10: f: LPAR ID 
+0

對我來說,這看起來像一個動作表。你在期待哪些不在輸出中? – rici

+0

* goto表*或者可能被稱爲*跳轉表*。 – Paul

+0

而形式'轉變'的行是什麼? – rici

回答

3

檸檬輸出動作表和轉到表在單個塊中。 goto函數看起來像是shift操作,除了lookahead是非終端而不是終端。

所以,如果我們把狀態0:

LPAR shift  1  
    ID shift  4  
start accept 
    e shift  11  
    t shift  6  
    f shift  5  

前兩行分別讀LPAR和ID的動作。其餘行是goto函數,當reduce操作通過彈出堆棧來顯示這個狀態時使用goto函數。 (與傳統的LR機器不同,在檸檬中,accept動作位於goto表中,而不是輸入終點僞終端的動作表中。)

儘管大多數LR解析器的描述都將動作表格和goto表格,「移位」操作和縮減操作的「goto」部分之間幾乎沒有什麼區別。這兩種方法都將當前狀態編號和符號推送到解析器堆棧中。不同之處在於減少操作(例如reduce 6,意思是「減少使用產量6」 - 它與狀態6無關)首先將指示產品的右側彈出堆棧並設置當前狀態切換到堆棧頂部的新顯示狀態,然後執行shift/goto。 (另一個不同之處在於,在移動動作之後,需要讀取新的超前令牌,而減少動作不會消耗輸入數據。)

+0

謝謝我認爲它!推選並接受! – Paul

+0

我還會補充說,在減少後,我們使用生產(非終端)的左側和彈出右側後留在堆棧上的狀態,以確定新的動作。 – Paul

相關問題