coffeescript - 可视化 LALR 语法

标签 coffeescript visualization graphviz lalr

我想可视化一个语法文件(实际上是 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创建语法图:

CoffeeScript Syntax Diagram

. . .

请注意,转换器仅评估语法的“bnf”部分,因此它不考虑标记定义。这可以通过对 W3C 风格的语法进行一些手动后处理来改进。

关于coffeescript - 可视化 LALR 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154790/

相关文章:

javascript - Firefox 不显示自定义错误消息

python - 使用带有 kind ='reg' 的 seabornpairplot 时出现轴限制问题

graphviz - 混合垂直和水平布局(用于水平布局的类图)

c - 使用 graphviz 作为库的问题

javascript - 为什么当错误出现时支架在 coffeescript 中工作

javascript - CoffeeScript 中的方法调用语法

javascript - 如何选择清晰的颜色在 d3js 图表的条形图上绘制文本?

python - 如何将类别矩阵可视化为 RGB 图像?

windows - Graphviz:如何从 .dot 到图表?

javascript - 我可以在 node.js 中使用 CoffeeScript 而不是 JS 吗?