gpt4 book ai didi

antlr3 - C#,ANTLR,ECMAScript语法问题

转载 作者:行者123 更新时间:2023-12-04 04:39:02 25 4
gpt4 key购买 nike

我正在尝试使用C#解析JavaScript(ECMASCript)。
我找到了有关如何创建新项目的以下说明:
http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075
因此,我下载了ANTLRWorks,ANTLR v3,解压缩后的ANTLR,创建了VS2010项目(.NET4),添加了引用,检查并生成了语法。
然后我收到很多编译错误:

The type or namespace name 'AstParserRuleReturnScope' could not be found (are you missing a using directive or an assembly reference?)

The type or namespace name 'GrammarRule' could not be found (are you missing a using directive or an assembly reference?)


Stackoverlow为他们提供了解决方案: antlr c# errors when integrating into VS2008
所以我下载了新的运行时,覆盖了旧的运行时,并重新编译了项目,并得到了

The name 'HIDDEN' does not exist in the current context 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消息,因为适配器为null。
我已经通过添加解决了
parser.TreeAdaptor = new CommonTreeAdaptor();
更新2:
因此,最后,我开始了我的主要任务:解析JavaScript。
ANTLR highlights Chris Lambrou编写的ECMAScript语法。
因此,我生成了lexer/parser并使用非常简单的JavaScript代码运行它:
var f = function () { };
并且解析失败,并从tree.ToStringTree()获得以下输出:
<error: var q = function () { };>

最佳答案

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

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

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

关于antlr3 - C#,ANTLR,ECMAScript语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com