C#,ANTLR,ECMAScript语法问题

时间:2012-02-08 17:06:32

标签: antlr3

我正在尝试使用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 () { };>

1 个答案:

答案 0 :(得分:1)

你的语法规则说在表达式的末尾应该有一个分号,但在你的主要功能中:

var stream = new ANTLRStringStream("1+2");

缺少分号。不应该是“1 + 2;”?