2015-11-03 57 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

相关问题