【发布时间】:2012-02-08 17:06:32
【问题描述】:
我正在尝试使用 C# 解析 JavaScript (ECMASCript)。
我找到了有关如何创建新项目的以下说明: http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075
所以我已经下载了 ANTLRWorks,ANTLR v3,解压了 ANTLR,创建了一个 VS2010 项目 (.NET4),添加了引用,检查并生成了语法。
然后我收到很多编译错误:
找不到类型或命名空间名称“AstParserRuleReturnScope”(您是否缺少 using 指令或程序集引用?)
找不到类型或命名空间名称“GrammarRule”(您是否缺少 using 指令或程序集引用?)
Stackoverlowed 为他们提供了解决方案:antlr c# errors when integrating into VS2008
所以我已经下载了新的运行时,覆盖了旧的并重新编译了项目并得到了
当前上下文 d:\Workspace.1\ScriptParser\ScriptParser\TestLexer.cs 中不存在名称“HIDDEN”
好的,我已按照以下对话中的建议将 HIDDEN 更改为 Hidden:[antlr-interest] How viable is the Csharp3 target? (more specific questions)
现在我正在尝试解析输入。找了几个例子,写了如下代码:
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???
}
}
}
我的目标是用 ANTLR 解析 JavaScript 文件,但似乎没有我想象的那么容易......
更新:
正如Why are antlr3 c# parser methods private? 中所建议的,我通过在 expr 规则之前添加修改的“public”来修改了 Test.g 语法:
public expr : mexpr (PLUS^ mexpr)* SEMI!
;
然后重新生成代码,将 HIDDEN 替换为 Hidden(再次)并修改代码如下:
var stream = new ANTLRStringStream("1+2");
var lexer = new TestLexer(stream);
var tokenStream = new CommonTokenStream(lexer);
var parser = new TestParser(tokenStream);
var result = parser.expr();
var tree = (CommonTree)result.Tree;
而且它不是在线崩溃
root_0 = (object)adaptor.Nil();
在下面生成的代码中
try { DebugEnterRule(GrammarFileName, "expr");
DebugLocation(7, 0);
try
{
// d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:13: ( mexpr ( PLUS ^ mexpr )* SEMI !)
DebugEnterAlt(1);
// d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:15: mexpr ( PLUS ^ mexpr )* SEMI !
{
root_0 = (object)adaptor.Nil();
DebugLocation(7, 15);
PushFollow(Follow._mexpr_in_expr31);
带有 NullReferenceException 消息,因为适配器为空。
我已经通过添加解决了它
parser.TreeAdaptor = new CommonTreeAdaptor();
更新 2:
所以,我终于开始了我的主要任务:解析 JavaScript。
ANTLR highlights Chris Lambrou 的 ECMAScript 语法。
所以我生成了词法分析器/解析器并使用非常简单的 JavaScript 代码运行它:
var f = function () { };
解析失败,tree.ToStringTree() 的输出如下:
<error: var q = function () { };>
【问题讨论】:
-
感谢您提供出色的教程。据我了解,语法中的规则应该转换为方法。我使用antlr.org/wiki/pages/viewpage.action?pageId=557075 的语法,ANTLRWorks 生成“expr”、“atom”等方法,但它们是私有的。
-
谢谢亚历克斯。 W.r.t.私有方法(解析器规则),见另一个问答:stackoverflow.com/questions/6411520/…
-
感谢您发布此信息,我遇到了完全相同的问题,并且您的每个解决方案都运行良好。 +1。
标签: antlr3