c# - ANTLR - 为 AST 编写树语法

标签 c# lua antlr tree-grammar

我的语法文件为一些 Lua 代码输出了一个 AST,它目前正在为我做解析和词法分析。我想为此添加一个树语法,但由于我使用的是 C#,所以我不确定该怎么做。当您已经编写了解析器和词法分析器时,生成树语法代码的基本过程是什么?

更新:我有以下语法文件:

tree grammar LuaGrammar;

options {
  backtrack=true;
  language=CSharp2;
  //output=AST;
  tokenVocab=Lua;
  filter=true;
  ASTLabelType=CommonTree;
}
@lexer::namespace{/*my namespace*/}
@parser::namespace{/*my namespace*/}

dummyRule
    :   ^('=' x=. y=.) {};

放置在与我的主语法文件相同的目录中,生成的很好。但是,在尝试编译时出现以下错误:

[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:12:18: unknown or invalid action scope for tree grammar: lexer
[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:13:19: unknown or invalid action scope for tree grammar: parser

我走在正确的轨道上还是完全偏离了轨道?

最佳答案

回到我常用的计算器语法示例:)

这就是您声明 Tree Walker 类的方式

class CalcTreeShaker extends TreeParser;

expr returns [float r]
{
float a,b;
r=0;
}
:   #(PLUS a=expr b=expr)   {r = a+b;}
|   #(STAR a=expr b=expr)   {r = a*b;}
|   i:INT           {r = Convert.ToSingle(i.getText());}
;

这里我们有一个名为 expr 的树规则。树遍历器与解析器语法非常相似。

最大的区别在于,虽然解析器语法必须完全匹配,但树语法只需要匹配树的一部分。

expr 规则中,我们可以看到它匹配任何具有标记 PLUSSTARINT.

我们可以看到我们正在匹配树,因为我们使用的是 Antlr 的树语法 #(...)

PLUSSTAR 树也匹配 2 个 expr 规则。每个 expr 规则都分配了一个名称,因此我们可以使用它来评估表达式。与解析器语法类似,我们可以将 C# 代码放入由 {...} 定义的 block 中。

另请注意,在此示例中,我们展示了如何从 TreeWalker 规则返回一个值,我们使用语法 return [...]

要调用您创建的 tree walker,然后调用它的顶级规则。我将从 Antlr 示例中复制它:)

// Get the ast from your parser.
CommonAST t = (CommonAST)parser.getAST();

// Create the Tree Shaker
CalcTreeWalker walker = new CalcTreeWalker();
CalcParser.initializeASTFactory(walker.getASTFactory());

// pass the ast to the walker and call the top level rule.
float r = walker.expr(t);

关于c# - ANTLR - 为 AST 编写树语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242089/

相关文章:

c# - 如何在 C# 中获取所有枚举值的数组?

c# - .Net 中的优先级队列

lua - Wireshark Lua 解剖器重组 - 未使用以前的 Tvb 数据调用解剖器

Antlr4极其简单的语法失败

c# - 抑制 "warning CS4014: Because this call is not awaited, execution of the current method continues..."

c# - Rhino.Mocks 和 ref 参数

c++ - 在 Qt Creator 中将 Lua 与 C++ 链接起来

lua - lua 中有什么不同需要路径与 "/"或 "."

java - 包含标记的 ANTLR 文本 - SWIFT 换行冒号

ANTLR v4 的 C 语法