2015-11-03 2 views
3

Я пытаюсь сгенерировать таблицу парсера с использованием генератора синтаксического анализатора, но файл .out, сгенерированный при запуске lemon grammar.y, содержит только состояния автомата.Создайте таблицу разбора LR из генератора парсера Lemon

Есть ли способ получить таблицу 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 table * или может быть известен как * jump table *. – Paul

+0

И строки вида ' shift ' что? – rici

ответ

3

Лимонная выводит таблицу действий и таблицу Гото в одном блоке. Функция goto выглядит как действия сдвига, за исключением того, что lookahead - это не терминал, а не терминал.

Так что, если мы возьмем Состояние 0:

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

Первые две строки являются действия на чтение LPAR и ID соответственно. Остальные строки - это функция goto, которая используется, когда действие уменьшения показывает это состояние, выбирая стек. (В отличие от традиционной машины LR, в Lemon действие accept находится в таблице goto, а не в таблице действий для псевдотерминала конца ввода.)

Хотя большинство описаний анализатора LR различают действие таблицы и таблицы goto, очень мало различий между действием «shift» и «goto» частью действия уменьшения. Оба они нажимают текущий номер состояния и символ на стек парсера. Разница заключается в том, что действие уменьшения (например, reduce 6, что означает «уменьшить использование продукции 6» - оно не имеет ничего общего с состоянием 6) сначала выдает правую часть указанного производства из стека и устанавливает текущий перед тем, как выполнить сдвиг/goto, перейдите в новое состояние в верхней части стека. (Другое отличие состоит в том, что после действия сдвига необходимо прочитать новый токен, но действие уменьшения не потребляет вход.)

+0

Спасибо, я думаю, это так! Проголосовали и приняли! – Paul

+0

Еще я добавил, что после сокращения мы используем левую часть производственного (нетерминального) и состояния, оставшегося в стеке после появления правой стороны, чтобы определить новое действие. – Paul

 Смежные вопросы

  • Нет связанных вопросов^_^