Что не так в грамматике - PullRequest
       9

Что не так в грамматике

0 голосов
/ 11 сентября 2010

Я пытаюсь получить пример простого оценщика выражений на веб-сайте ANTLR, работающего в ActionScript. Я смог заставить работать версию Java.Но моя версия ActionScript получает следующую ошибку:

   TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at org.antlr.runtime::Lexer/nextToken()[/Users/gscott/antlr/code/antlr/main/runtime/ActionScript/project/src/org/antlr/runtime/Lexer.as:69]
    at org.antlr.runtime::CommonTokenStream/fillBuffer()[/Users/gscott/antlr/code/antlr/main/runtime/ActionScript/project/src/org/antlr/runtime/CommonTokenStream.as:84]
    at org.antlr.runtime::CommonTokenStream/LT()[/Users/gscott/antlr/code/antlr/main/runtime/ActionScript/project/src/org/antlr/runtime/CommonTokenStream.as:227]
    at org.antlr.runtime::CommonTokenStream/LA()[/Users/gscott/antlr/code/antlr/main/runtime/ActionScript/project/src/org/antlr/runtime/CommonTokenStream.as:289]
    at Eval_in_ASParser/prog()[C:\Users\Wayne-VII\Documents\Flex Builder 3\ANTLR_AIR_01\src\Eval_in_ASParser.as:61]
    at ANTLR_AIR_01/runProgram()[C:\Users\Wayne-VII\Documents\Flex Builder 3\ANTLR_AIR_01\src\ANTLR_AIR_01.mxml:11]
    at ANTLR_AIR_01/__bRunSource_click()[C:\Users\Wayne-VII\Documents\Flex Builder 3\ANTLR_AIR_01\src\ANTLR_AIR_01.mxml:20]

Что ж, поскольку код находится в файле SWC и его нельзя увидеть в отладчике, я загрузил исходный код ActionScript и попытался запустить сборку ant, что не удалось.

Итак, вот мой грамматик ANTLR:

grammar Eval_in_AS;

options {
    language=ActionScript;
}

@header {
//import java.util.HashMap;
import flash.utils.Dictionary;
}

@members {
/** Map variable name to Integer object holding value */
public var memory:Dictionary = new Dictionary();
public var output:String = new String();

public function getOutput():String
{
return output;
}
}

prog:   stat+ EOF;

stat:   expr NEWLINE {output +="\n" + $expr + ":" + $expr.value;}
    |   ID '=' expr NEWLINE
        {memory[$ID.text] = int($expr.value);}
    |   NEWLINE
    ;

expr returns [int value]
    :   e=multExpr {$value = $e.value;}
        (   '+' e=multExpr {$value += $e.value;}
        |   '-' e=multExpr {$value -= $e.value;}
        )*
    ;

multExpr returns [int value]
    :   e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
    ; 

atom returns [int value]
    :   INT {$value = int($INT.text);}
    |   ID
        {
        if ( memory.hasOwnProperty($ID.text)) {$value = memory[$ID.text];}
        else {output +="\nundefined variable:"+$ID.text+"\n";$value = 0;}
        }
    |   '(' expr ')' {$value = $expr.value;}
    ;

ID  :   ('a'..'z'|'A'..'Z')+ ;
INT :   '0'..'9'+ ;
NEWLINE:'\r'? '\n' ;
WS  :   (' '|'\t')+ {skip();} ;

А вот мой тестовый стенд:

var lexer:Eval_in_ASLexer = new Eval_in_ASLexer(taSource.text as CharStream);
var tokens:CommonTokenStream = new CommonTokenStream(lexer);
var parser:Eval_in_ASParser = new Eval_in_ASParser(tokens);
parser.prog();
taOutput.text = parser.getOutput();

В приведенном выше коде taOutputотображаемый текстМой ввод:

a=3
a

Кто-нибудь может увидеть, что я делаю неправильно?

Конечно, я думаю, что есть ошибка в этой версии цели ActionScript ANTLR, но мне не нравится, как другие людиобвинять инструменты, когда это их код.Итак, сначала я спрашиваю, есть ли что-то не так в моем кодировании.

1 Ответ

1 голос
/ 23 октября 2010

Я думаю, что проблема в новой версии ANTLR 3.2.2, и ANTLRWorks не генерирует правильный кодЧитайте другие места, где я должен использовать инструменты командной строки.Закрытие этого вопроса.

...