【问题标题】:How to to create / specify the AST input for testing a tree grammar with ANTLRWorks?如何使用 ANTLRWorks 创建/指定用于测试树语法的 AST 输入?
【发布时间】:2012-01-19 21:45:23
【问题描述】:

背景:我创建了一个 ANTLR 语法。我能够使用 ANTLRWorks 对其进行测试和调试,并验证解析器创建了我心中的 AST。现在,我想为AST写一个树语法,解析树并用ANTLRWorks调试树语法。

问题:我想用 ANTLRWorks 测试和调试树语法。因此,我想解析解析器创建的 AST。使用 ANTLRWorks 测试树语法时如何指定 AST 作为输入?

附: 我已经研究了Does anyone know of a way to debug tree grammars in ANTLRWorks 的问题/答案,但它没有回答我的问题。尽管被 OP 接受,但他发表了类似的评论。

【问题讨论】:

    标签: antlr antlr3 antlrworks


    【解决方案1】:

    使用 ANTLRWorks 测试树语法时如何指定 AST 作为输入?

    您不需要自己提供 AST,只需生成 AST 的解析器即可。

    给定以下产生 AST 的语法:

    grammar ASTDemo;
    
    options { 
      output=AST;
    }
    
    tokens {
      ROOT;
      U_MIN;
    }
    
    parse
     : expression EOF -> ^(ROOT expression)
     ;
    
    expression
     : addition
     ;
    
    addition
     : multiplication (('+' | '-')^ multiplication)*
     ;
    
    multiplication
     : unary (('*' | '/')^ unary)*
     ;
    
    unary
     : '-' atom -> ^(U_MIN atom)
     | atom
     ;
    
    atom
     : ID
     | NUMBER
     | '(' expression ')' -> expression
     ;
    
    ID     : ('a'..'z' | 'A'..'Z')+;
    NUMBER : '0'..'9'+ ('.' '0'..'9'*)?;
    SPACE  : (' ' | '\t' | '\r' | '\n')+ {skip();};
    

    以下将是上述语法生成的 AST 的树语法:

    tree grammar ASTDemoWalker;
    
    options {
      output=AST;
      tokenVocab=ASTDemo;
      ASTLabelType=CommonTree;
    }
    
    parse
     : ^(ROOT expression)
     ;
    
    expression
     : ^('+' expression expression)
     | ^('-' expression expression)
     | ^('*' expression expression)
     | ^('/' expression expression)
     | ^(U_MIN expression)
     | atom
     ;
    
    atom
     : ID
     | NUMBER
     ;
    

    确保将ASTDemo.gASTDemoWalker.g 放在同一个文件夹中。在 ANTLRWorks 中打开这两个语法并首先通过按 CTRL+SHIFT+GASTDemo.g 生成词法分析器和解析器,然后生成 tree walker通过打开 ASTDemoWalker.g 并按 CTRL+SHIFT+G

    现在,在ASTDemoWalker.g 编辑器面板中,按下 CTRL+D 启动调试器,并将以下源代码粘贴到文本区域:

    42 * ((a + 3) / -3.14)
    

    然后按确定

    您现在可以逐步完成调试过程,最后,您可以看到解析器生成的 AST:

    以及树行者如何走过所说的 AST:

    如果你现在在树语法中犯了一个“意外”错误,比如说,你定义了^('*' expression),而不是^('*' expression expression)。如果再次调试树语法,通过42节点后会看到失败:

    在 AST 中,42 节点之后还有另一个节点,而 tree walker 预计在 * 根节点之后只有 1 个单个节点 (42)。

    当然,这是一个简单的语法,但是即使您熟悉 ANTLR,在 @$& 中跟踪树语法中的错误有时也很痛苦! :)

    【讨论】:

    • 再次感谢您的宝贵帮助@Bart Kiers,我现在有了在 ANTLRWorks 中同时使用语法和树语法的想法。 - 说真的,如果你还没有开始,你应该写一本关于ANTLR的书。
    • 谢谢@ndroock1,当然不客气。不,我还没有从一本书开始 :),我想我会坚持偶尔写博客并回答关于 SO 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多