Проблемы с грамматикой в ​​C #, ANTLR, ECMAScript - PullRequest
9 голосов
/ 08 февраля 2012

Я пытаюсь проанализировать 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 на Hidden, как рекомендовано в следующем разговоре: [antlr-интереса] Насколько жизнеспособна цель 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 theECMAScript грамматика Криса Ламбру.

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

var f = function () { };

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

<error: var q = function () { };>

1 Ответ

1 голос
/ 04 сентября 2012

Ваше правило грамматики гласит, что в конце выражения должна быть точка с запятой, но в вас основная функция:

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

отсутствует точка с запятой. Разве это не должно быть "1 + 2;"?

...