Визуализируйте грамматику LALR - PullRequest
9 голосов
/ 16 ноября 2011

Я хотел бы визуализировать файл грамматики (на самом деле грамматика Jison для кофе-скрипта).Таким образом, входной файл является файлом грамматики в стиле Bison / Yacc.Ожидаемый результат может быть точечным файлом Graphviz или чем-то подобным.

Я не обязательно ищу полную IDE, такую ​​как GOLD .Но важно иметь возможность обрабатывать ввод LALR, поэтому превосходные ANLTRWorks не учитываются.

Я также проверил сравнение парсеров в Википедии , но включает только поддержку IDE, но не визуализацию.

Это файл грамматики coffeescript Я действительно хочу визуализировать.

Ответы [ 2 ]

12 голосов
/ 22 ноября 2011

Вот инструкции по созданию синтаксической диаграммы.

Содержимое grammar.coffee - это исполняемый код, который необходимо запустить для получения фактической грамматики Jison. Я использовал страницу Try CoffeeScript для ее компиляции после замены вызова Jison на предупреждение Javascript. Затем запустил получившийся Javascript для получения грамматики, которая выглядит так:

{
  "tokens":" TERMINATOR TERMINATOR TERMINATOR STATEMENT INDENT OUTDENT INDENT OUTDENT IDENTIFIER NUMBER STRING JS REGEX BOOL = = INDENT OUTDENT : : INDENT OUTDENT RETURN RETURN HERECOMMENT PARAM_START PARAM_END -> =>  ,  , ... = ... . ?. :: :: INDEX_START INDEX_END INDEX_SOAK { }  , TERMINATOR INDENT OUTDENT CLASS CLASS CLASS EXTENDS CLASS EXTENDS CLASS CLASS CLASS EXTENDS CLASS EXTENDS SUPER SUPER  FUNC_EXIST CALL_START CALL_END CALL_START CALL_END THIS @ @ [ ] [ ] .. ... [ ] , TERMINATOR INDENT OUTDENT INDENT OUTDENT , TRY TRY TRY FINALLY TRY FINALLY CATCH THROW ( ) ( INDENT OUTDENT ) WHILE WHILE WHEN UNTIL UNTIL WHEN LOOP LOOP FOR FOR FOR OWN , FORIN FOROF FORIN WHEN FOROF WHEN FORIN BY FORIN WHEN BY FORIN BY WHEN SWITCH INDENT OUTDENT SWITCH INDENT ELSE OUTDENT SWITCH INDENT OUTDENT SWITCH INDENT ELSE OUTDENT LEADING_WHEN LEADING_WHEN TERMINATOR IF ELSE IF ELSE POST_IF POST_IF UNARY - + -- ++ -- ++ ? + - MATH SHIFT COMPARE LOGIC RELATION COMPOUND_ASSIGN COMPOUND_ASSIGN INDENT OUTDENT EXTENDS",
  "bnf":
  {
    "Root":
    [
      ["","return $$ = new yy.Block;",null],
      ["Body","return $$ = $1;",null],
      ["Block TERMINATOR","return $$ = $1;",null]
    ],
    "Body":
    [
      ["Line","$$ = yy.Block.wrap([$1]);",null],
      ["Body TERMINATOR Line","$$ = $1.push($3);",null],
      ["Body TERMINATOR","$$ = $1;",null]
    ],
    "Line":
    [
      ["Expression","$$ = $1;",null],
      ["Statement","$$ = $1;",null]
    ],
    ...

Вышеуказанное может быть передано в преобразователь грамматики Jison-to-W3C , в результате чего в такой грамматике:

Root     ::= ( Body | Block TERMINATOR )?
Body     ::= Line ( TERMINATOR Line | TERMINATOR )*
Line     ::= Expression
           | Statement
...

Отсюда мы можем * Генератор железнодорожных диаграмм создать синтаксическую диаграмму:

CoffeeScript Syntax Diagram

. , .

Обратите внимание, что конвертер оценивает только часть "bnf" грамматики, поэтому он не учитывает определения токенов. Это можно улучшить, выполнив некоторую ручную постобработку грамматики в стиле W3C.

0 голосов
/ 21 января 2012

, поэтому я попробовал еще раз и сразу обнаружил свою самую вопиющую ошибку - опубликованный мною json неправильно использовал сингл вместо двойных кавычек.позвольте мне подробно описать рабочий процесс;это достаточно просто, и если вы уже используете CoffeeScript на NodeJS, вы готовы пойти:

  • найдите модуль node_modules/coffee-script/lib/coffee-script/grammar.js в вашей файловой системе;

  • скопируйте и вставьте код этого файла в исходную панель js-> coffee pane на сайте js2coffee (вы можете пропустить это, но я считаю, что редактировать его гораздо удобнееCS, чем возиться с JS).

  • сохранить переведенный код в node_modules/coffee-script/lib/coffee-script/grammar.coffee;

  • иди и найдите

    exports.parser = new Parser(
      tokens: tokens.join(" ")
      bnf: grammar
      operators: operators.reverse()
      startSymbol: "Root"
    )
    

    в коде;замените его на

    console.log JSON.stringify
      tokens: tokens.join " "
      bnf: grammar
      operators: operators.reverse()
      startSymbol: "Root"
    

    , стараясь использовать точно такой же отступ (два пробела для первой строки, четыре для остальных).

  • из командыв строке введите coffee node_modules/coffee-script/lib/coffee-script/grammar.coffee > /tmp/coffee.grammar;

  • , скопируйте и вставьте код полученного файла в преобразователь грамматики ;

  • скопируйте и вставьте полученную грамматику EBNF из конвертера в редактор грамматик в генераторе железнодорожных схем ;

  • перейдите на вкладку View Diagram и- радуйся!

Это своего рода рутинная работа, чтобы делать все эти копи-нелишние вещи, но, безусловно, достаточно для любой одноразовой визуализации.Я много искал в Интернете разумный генератор RR-диаграмм, и именно этот, безусловно, один из тех, у кого самый красивый результат.Что-то удивительное, когда вы думаете о том, насколько просты железнодорожные схемы.

...