gpt4 book ai didi

antlr - 如何使用 ANTLRWorks 创建/指定用于测试树语法的 AST 输入?

转载 作者:行者123 更新时间:2023-12-04 06:00:44 27 4
gpt4 key购买 nike

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

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

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

最佳答案

How do I specify the AST as input when testing the tree grammar with ANTLRWorks?



您不需要自己提供 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 中打开两个语法并从 ASTDemo.g 生成词法分析器和解析器首先按 CTRL+SHIFT+G,然后通过打开 ASTDemoWalker.g 生成树行走器并按 CTRL+SHIFT+G。

现在,来自 ASTDemoWalker.g编辑器面板,通过按 CTRL+D 启动调试器并将以下源粘贴到文本区域:
42 * ((a + 3) / -3.14)

并按确定。

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

enter image description here

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

enter image description here

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

enter image description here

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

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

关于antlr - 如何使用 ANTLRWorks 创建/指定用于测试树语法的 AST 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933788/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com