Проблемы с грамматикой C #, ANTLR, ECMAScript

Я пытаюсь разобрать JavaScript (ECMASCript) с помощью C #.

Я нашел следующую инструкцию, как создать новый проект: http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075

Итак, я загрузил ANTLRWorks, ANTLR v3, распаковал ANTLR, создал проект VS2010 (.NET4), добавил ссылки, проверил и сформировал грамматику.

Затем я получил много ошибок компиляции:

Не удалось найти тип или имя пространства имен AstParserRuleReturnScope (вам не хватает директивы using или ссылки на сборку?)

Тип или имя пространства имен GrammarRule 'не удалось найти (вам не хватает директивы using или ссылки на сборку?)

Stackoverlowed для них и получил решение: antlr c # ошибки при интеграции в VS2008

Итак, я загрузил новую среду выполнения, перезаписать старый, перекомпилировать проект и получить

Имя 'HIDDEN' не существует в текущем контексте d: \ Workspace.1 \ ScriptParser \ ScriptParser \ TestLexer.cs

Хорошо, я изменил HIDDEN на Скрыто, как рекомендовано в следующем разговоре: [antlr-Interest] Насколько жизнеспособна цель Csharp3? (более конкретные вопросы)

Теперь я пытаюсь разобрать ввод. Я нашел несколько примеров и написал следующий код:

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???
        }
    }
}

Моя цель - проанализировать файл JavaScript с помощью ANTLR, но, похоже, это будет не так просто, как я думал ...

Обновление:

Как было предложено в Почему методы синтаксического анализатора Antlr3 C # являются частными? Я изменил грамматику Test.g, добавив "public", измененный перед правилом expr:

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 выделяет грамматику ECMAScript Криса Ламброу.

Итак, я сгенерировал лексер / парсер и запустил его с помощью очень простого кода JavaScript:

var f = function () { };

, и синтаксический анализ завершился неудачно со следующим выводом tree.ToStringTree ():


9
задан Community 23 May 2017 в 01:53
поделиться