【问题标题】:C#, ANTLR, ECMAScript grammar troublesC#、ANTLR、ECMAScript 语法问题
【发布时间】: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 () { };>

【问题讨论】:

标签: antlr3


【解决方案1】:

你的语法规则说表达式的末尾应该有一个分号,但是在你的 main 函数中:

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

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

【讨论】:

  • 当然是“1+2;”是有效的 Javascript。但是“1+2”(或至少“1+2\n”)也是如此。 ANTLR 语法如何处理丢失的“;”问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
相关资源
最近更新 更多