我想可视化一个语法文件(实际上是 CoffeeScript 的 Jison 语法)。所以输入文件是一个 Bison/Yacc 风格的语法文件。预期的输出可能是 Graphviz 点文件或类似文件。
我不一定要寻找完整的 IDE,例如 GOLD .但是能够处理 LALR 输入很重要,这就是为什么出色的 ANLTRWorks不考虑。
我还检查了 comparison of parsers on Wikipedia ,但它仅包括 IDE 支持,但不包括可视化。
这是coffeescript grammar file我实际上想形象化。
最佳答案
以下是创建语法图的说明。
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 grammar converter , 结果
在这样的语法中:
Root ::= ( Body | Block TERMINATOR )?
Body ::= Line ( TERMINATOR Line | TERMINATOR )*
Line ::= Expression
| Statement
...
从这里我们可以得到Railroad Diagram Generator创建语法图:
. . .
请注意,转换器仅评估语法的“bnf”部分,因此它不考虑标记定义。这可以通过对 W3C 风格的语法进行一些手动后处理来改进。
关于coffeescript - 可视化 LALR 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154790/