извлечь правила грамматики BNF из файла yacc

У меня есть файл yacc, описывающий определенный язык, для которого я разрабатываю редактор с использованием IMP (проект eclipse). Я использую LPG в качестве генератора анализатора, поэтому мне нужно было извлечь правила BNF из моего файла yacc. полученный мной файл yacc содержит правила и действия. Однако я хотел извлечь только правила описания грамматики, которые будут использоваться в LPG. один из способов сделать это - вручную извлечь правила и переформатировать их в синтаксис BNF (или, возможно, написать программу, чтобы преобразовать ее так, как я этого хочу). Мне было интересно, есть ли автоматизированный способ сделать это. Я читал в некоторых блогах, что bison может помочь, но я не мог точно найти подходящие команды. может кто знает как бороться с этой проблемой.

Я не могу опубликовать файл yacc, который у меня есть, так как он конфиденциальный. но я мог бы привести пример следующим образом

argExprList:
       assignExp
          {
            // some rules here 
          }
        | assignExpList ',' assignExp
            {
              //some other rules here
            }
        ;

то, во что я хотел его преобразовать, просто похоже на

argExpList ::= assignExp|assignExpList ',' assignExp

person lferasu    schedule 20.10.2013    source источник


Ответы (1)


Bison может помочь, если вы готовы выполнить некоторую постобработку.

Если вы запустите bison с параметром -v, он создаст файл с именем filename.output (где filename — это базовое имя файла .y); этот файл содержит копию грамматики и описание каждого состояния. В грамматике нет действий, и в каждой строке есть одно произведение. Но вам нужно будет проделать некоторую работу:

  1. Каждое производство пронумеровано. Вам нужно будет удалить эти номера.

  2. Если есть промежуточные действия правила, они будут отображаться как пустые нетерминалы со странными именами. Имена будут что-то вроде $@8 или @2. Вам нужно будет удалить эти токены и соответствующие им пустые производства.

  3. Пустые производства (по крайней мере, в одной из последних версий bison) отображаются как /* empty */. Это может не быть вашим предпочтением.

  4. Он не меняет : на ::=

Таким способом я извлекал грамматики из файлов yacc/bison, и это очень просто; вы можете внести все вышеперечисленные изменения с помощью простого скрипта sed или awk.

person rici    schedule 20.10.2013