是否有人知道在C#中使用ANTLR生成的AST的教程?我能找到的最接近的是这个,但它并不是非常有用.
我的目标是根据我正在使用的特定于域的语言遍历我正在生成的树,并使用树来输出生成的C#代码.
基于Java的教程也很有帮助 - 任何提供如何遍历ANTLR AST的明确示例的东西.
我正在尝试使用C#解析JavaScript(ECMASCript).
我找到了关于如何创建新项目的以下说明:http: //www.antlr.org/wiki/pages/viewpage.action?pageId = 557075
所以我下载了ANTLRWorks,ANTLR v3,解压缩的ANTLR,创建了一个VS2010项目(.NET4),添加了引用,检查并生成了语法.
然后我收到了很多编译错误:
找不到类型或命名空间名称'AstParserRuleReturnScope'(您是否缺少using指令或程序集引用?)
找不到类型或命名空间名称'GrammarRule'(您是否缺少using指令或程序集引用?)
Stackoverlowed为他们并得到一个解决方案:集成到VS2008时antlr c#错误
所以我下载了新的运行时,覆盖了旧的运行时并重新编译了项目并得到了
当前上下文中不存在名称"HIDDEN"d:\ Workspace.1\ScriptParser\ScriptParser\TestLexer.cs
好的,我已经按照以下对话中的建议将HIDDEN更改为Hidden:[antlr-interest] Csharp3目标的可行性如何?(更具体的问题)
现在我正在尝试解析输入.我找到了几个例子,并编写了以下代码:
using Antlr.Runtime;
namespace ScriptParser
{
class Program
{
static void Main(string[] args)
{
var stream = new ANTLRStringStream("1+2");
var lexer = new TestLexer(stream);
var tokenStream = new CommonTokenStream(lexer);
var parser = new TestParser(tokenStream);
// what exactly should be here???
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是使用ANTLR解析JavaScript文件,但它似乎并不像我想象的那么容易......
更新:
正如 为什么antlr3 c#解析器方法是私有的?我通过添加在expr规则之前修改的"public"修改了Test.g语法:
public expr : mexpr (PLUS^ mexpr)* SEMI!
;
Run Code Online (Sandbox Code Playgroud)
然后重新生成代码,将HIDDEN替换为Hidden(再次)并修改代码如下:
var …Run Code Online (Sandbox Code Playgroud) 我正在编写一个函数解析引擎,它使用正则表达式来分隔各个术语(定义为常量或变量,后跟(可选)由运算符).它工作得很好,除非我在其他分组术语中对术语进行分组.这是我正在使用的代码:
//This matches an opening delimiter
Regex openers = new Regex("[\\[\\{\\(]");
//This matches a closing delimiter
Regex closers = new Regex("[\\]\\}\\)]");
//This matches the name of a variable (\w+) or a constant numeric value (\d+(\.\d+)?)
Regex VariableOrConstant = new Regex("((\\d+(\\.\\d+)?)|\\w+)" + FunctionTerm.opRegex + "?");
//This matches the binary operators +, *, -, or /
Regex ops = new Regex("[\\*\\+\\-/]");
//This compound Regex finds a single variable or constant term (including a proceeding operator,
//if any) OR a group containing multiple …Run Code Online (Sandbox Code Playgroud) 我必须编写一个能够解析公式的程序.它应该像下面这个例子一样工作:
输入:5x + 7 ^ sin(z)/ 2T + 44
输出:输入x,z,t的值
输入:
2,1,2输出:答案是:某事
它应该支持(+,*, - ,^,%,SIN,COS)
我读过这个页面关于Shunting-yard算法
而且我也知道如何将Infix表达式转换为后缀或前缀.
这是我的算法:
1 - 给出表达.
2 - 如果括号是平衡,则转到步骤3否则显示错误转到步骤1
3 - 查找除(SIN,COS)之外的所有变量
4 - 从输入
5中提供变量 - 替换变量
6 - 前缀表达式并计算它
7 - 显示导致输出和关闭程序
是对的吗 ?我想在C#中实现它.
请建议我任何注释可能对我有用.