Coffeescript 可视化LALR语法

Coffeescript 可视化LALR语法,coffeescript,visualization,graphviz,lalr,Coffeescript,Visualization,Graphviz,Lalr,我想可视化一个语法文件(实际上是咖啡语法脚本)。因此,输入文件是Bison/Yacc风格的语法文件。预期的输出可以是Graphviz点文件或类似的东西 我不一定要寻找一个完整的IDE,比如。但是能够处理LALR输入是很重要的,这就是为什么没有考虑到优秀的输入 我还检查了一个,但它只包括IDE支持,而不包括可视化 这是我真正想要可视化的部分。以下是创建语法图的说明 的内容是可执行代码,必须运行该代码才能获得实际的Jison语法。在用Javascript警报替换Jison调用后,我使用该页面对其进行

我想可视化一个语法文件(实际上是咖啡语法脚本)。因此,输入文件是Bison/Yacc风格的语法文件。预期的输出可以是Graphviz点文件或类似的东西

我不一定要寻找一个完整的IDE,比如。但是能够处理LALR输入是很重要的,这就是为什么没有考虑到优秀的输入

我还检查了一个,但它只包括IDE支持,而不包括可视化


这是我真正想要可视化的部分。

以下是创建语法图的说明

的内容是可执行代码,必须运行该代码才能获得实际的Jison语法。在用Javascript警报替换Jison调用后,我使用该页面对其进行编译。然后运行生成的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]
    ],
    ...
Root     ::= ( Body | Block TERMINATOR )?
Body     ::= Line ( TERMINATOR Line | TERMINATOR )*
Line     ::= Expression
           | Statement
...
可以将上述信息反馈给系统,从而 在这样的语法中:

{
  "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]
    ],
    ...
Root     ::= ( Body | Block TERMINATOR )?
Body     ::= Line ( TERMINATOR Line | TERMINATOR )*
Line     ::= Expression
           | Statement
...
从这里我们可以创建语法图:


注意,转换器只计算语法的“bnf”部分,因此它不考虑令牌定义。这可以通过对W3C风格的语法进行一些手动后处理来改进。

因此我再次尝试,发现我最明显的错误是我发布的json错误地使用了单引号而不是双引号。让我详细介绍一下工作流程;这很简单,如果您已经在NodeJS上运行了CoffeeScript,那么就可以开始了:

  • 在文件系统中找到
    节点\u modules/coffee script/lib/coffee script/grammar.js
    模块

  • 将该文件的代码复制并粘贴到网站上js->coffee窗格的源代码窗格中(你可以跳过它,但我发现编辑CS比摆弄js更容易)

  • 将翻译后的代码保存到
    节点_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节点\u modules/coffee script/lib/coffee script/grammar.coffee>/tmp/coffee.grammar

  • 将生成文件的代码复制粘贴到中

  • 从转换器将生成的EBNF语法复制并粘贴到语法编辑器中

  • 转到“查看图表”选项卡,然后-欢呼


这是一种杂务,做所有这些复制'n'粘贴的东西,但肯定足够好的任何一次性可视化。我一直在网上搜索一个合理的RR图生成器,而这个特定的生成器肯定是输出最漂亮的生成器之一。当你想到铁路图到底有多简单时,有点惊讶

“你是在要求形象化吗?”冈瑟,是的,这是我能想象的一种形象化。谢谢你的链接。参考页面包含一些指向我将要查看的工具的链接。它接受W3C风格的语法,并且与特定的解析策略无关。但是,来自其他语法符号(例如ABNF、ANTLR、Bison、GOLD、JavaCC、Jison、PEG.js、yacc)的转换器正在构建中。如果你有一点时间,我可以在几天内为吉森准备一个。但找不到CoffeeScript语法的.jison文件。语法只是在运行时组装的吗?@Gunther,听起来很大方。我用一个语法文件的链接更新了我的问题。请注意,铁路图生成器已经移动到它太棒了,非常感谢。接受它并投票表决似乎太少了:)我用了
JSON.stringify(语法)
而不是警告。@AdamSchmideg,很高兴知道你喜欢它。请记住,转换工具仍在开发中,远远不够完善。但是,我会认真尝试修复任何报告的缺陷。是否要发布,比如,您输入语法转换器的完整源代码?这样的RR图对我来说绝对有用!我设法使grammar.js溢出了它的表示,我确实像您所展示的那样对它进行了包装,但转换器仍然抱怨“词法分析失败,而在第413行第1列中需要标识名”,这恰好是EOF。还是为了简单起见粘贴整个语法?我很想自己做,tho。当它寻找IdentifierName时,它在jison输入上失败,并试图解析一个PEG.js语法。因此,JSON语法可能有问题。下面是如何使用jrunscript和json2.js实现这一点。从grammar.coffee中,删除
{Parser}=require'jison'
,并将解析器调用替换为
load(“json2.js”);println(JSON.stringify({tokens:tokens.join(“”),bnf:grammar,operators:operators.reverse(),startSymbol:'Root'}))。然后在
上编译它,尝试Coffescript
,并使用jrunscript运行生成的js。这将创建适合转换器的JSON。将通过电子邮件发送工件。期待您的邮件。这不是有点过于复杂了吗?我是说json2到底是什么?我可以
npm安装
它,但它甚至不会加载,但在
类未定义时失败
-修复了
首先需要
ing
joose
的问题。它仍然不能在nodejs中运行(不知道为什么我应该使用jrunscript,因为它不能加载json2,所以也会失败)。必须有可能以一种更直接的方式正确处理这一问题。