我正在尝试使用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
所以我下载了新的运行时,覆盖了旧的运行时并重新编译了项目并获得了
当前上下文中不存在名称'HIDDEN'd:\ Workspace.1 \ ScriptParser \ ScriptParser \ TestLexer.cs
好的,我已按照以下对话中的建议将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语法。
所以我生成了lexer / parser并使用非常简单的JavaScript代码运行它:
var f = function () { };
并且使用tree.ToStringTree()的以下输出解析失败:
<error: var q = function () { };>
答案 0 :(得分:1)
你的语法规则说在表达式的末尾应该有一个分号,但在你的主要功能中:
var stream = new ANTLRStringStream("1+2");
缺少分号。不应该是“1 + 2;”?