有人知道在C#中使用ANTLR生成的AST的教程吗?我能找到的最接近的是this,但是它并不是很有帮助。
我的目标是遍历根据我正在使用的领域特定语言生成的树,并使用这些树输出生成的C#代码。
基于Java的教程也将有所帮助-任何提供了如何遍历ANTLR AST的清晰示例的内容。
通过修改Manuel
Abadia文章
结尾的示例,我设法弄清了这一点。
这是我的版本,我刚好用它来将解析的代码转换为C#。这些步骤是:
CommonTree
。要获取节点的文字文本,请使用node.Text
。要获取节点的令牌名称,请使用node.Token.Text
。
请注意,node.Token.Text
如果它是一个虚构的令牌,没有相应的字符串,则只会为您提供令牌的实际名称。如果它是真实的令牌,node.Token.Text
则将返回其字符串。
例如,如果语法中包含以下内容:
tokens { PROGRAM, FUNCDEC }
EQUALS : '==';
ASSIGN : '=';
然后你会得到"PROGRAM"
,"FUNCDEC"
,"=="
,并"="
从相应的访问node.Token.Text
。
您可以在下面查看我的示例的一部分,也可以浏览完整版本。
public static string Convert(string input)
{
ANTLRStringStream sStream = new ANTLRStringStream(input);
MyGrammarLexer lexer = new MyGrammarLexer(sStream);
CommonTokenStream tStream = new CommonTokenStream(lexer);
MyGrammarParser parser = new MyGrammarParser (tStream);
MyGrammarParser.program_return parserResult = parser.program();
CommonTree ast = (CommonTree)parserResult.Tree;
Print(ast);
string output = header + body + footer;
return output;
}
public static void PrintChildren(CT ast)
{
PrintChildren(ast, " ", true);
}
public static void PrintChildren(CT ast, string delim, bool final)
{
if (ast.Children == null)
{
return;
}
int num = ast.Children.Count;
for (int i = 0; i < num; ++i)
{
CT d = (CT)(ast.Children[i]);
Print(d);
if (final || i < num - 1)
{
body += delim;
}
}
}
public static void Print(CommonTree ast)
{
switch (ast.Token.Text)
{
case "PROGRAM":
//body += header;
PrintChildren(ast);
//body += footer;
break;
case "GLOBALS":
body += "\r\n\r\n// GLOBALS\r\n";
PrintChildren(ast);
break;
case "GLOBAL":
body += "public static ";
PrintChildren(ast);
body += ";\r\n";
break;
....
}
}
问题内容: 我有一个C ++程序,需要从PHP脚本中获取数据,对其进行处理,然后将数据返回给我的PHP脚本。 如何将值从PHP传递到C ++? 您如何运行C ++脚本?您必须先对其进行一些编译吗? 您如何从C ++脚本中获取值? 问题答案: 1。 如何将值从PHP传递到C ++? 回答: 在php文件中,您可以使用 exec 函数来执行C ++二进制文件。例: 2。 您如何运行C ++脚本?您必须
前面我们给出了一段完整的C语言代码,就是在显示器上输出“C语言中文网”,如下所示: #include <stdio.h> int main() { puts("C语言中文网"); return 0; } 本节我们就来看看如何通过 Dev C++ 来运行这段代码。 Dev C++ 支持单个源文件的编译,如果你的程序只有一个源文件(初学者基本都是在单个源文件下编写代码),那么不用创建
我正在试着运行一个简单的minecraft插件,它是我通过一个本地插口服务器构建的。插件是 主要。爪哇 plugin.yml 每次我将项目作为jar导出到服务器的plugins文件夹并运行服务器时,它都会给我以下信息 有人能给我解释一下吗?如果代码的信息部分有什么意义,但是我搜索了一下,真的不能破译任何关于如何去做它所说的事情的说明。我还在学习java,我觉得主要是我忘记了一件简单的事情,但是我想
C++ 是由Bjarne Stroustrup于1979年在贝尔实验室开始开发的一种中级编程语言。 C++ 可在各种平台上运行,例如Windows,Mac OS和各种版本的UNIX。 本教程采用简单实用的方法来描述C++ 的概念。
问题内容: 可有人点我一个体面的RPC教程(或书)的Linux,就像在这个岗位。我尝试环顾四周,但发现的教程真的很老。 谢谢 问题答案: 由于RPC的想法可以追溯到1976年,并且在1981年由Xerox首次用于商业用途,因此我不确定什么东西可以视为真正的老教程。 这里有一些资源可能对您有所帮助。 使用RPC进行电源编程(1992) 远程过程调用| Linux Journal(1997年10月1日
Objective-C 是一种通用的,面向对象的编程语言,它将 Smalltalk 样式的消息传递添加到 C 编程语言中。 这是Apple用于 OS X 和 iOS 操作系统及其各自API(Cocoa 和 Cocoa Touch)的主要编程语言。