2010-09-10 109 views
0

我想在ActionScript中使用ANTLR 网站上的简单表达式求值器示例,我已经能够使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 

任何人都可以看到我在做什么错?

当然,我认为ANTLR的ActionScript目标版本存在一个错误,但我不喜欢其他人在他们的代码时责怪工具。所以首先我问我的编码是否有问题。

+0

我认为问题是新版本的ANTLR 3.2.2和ANTLRWorks没有生成正确的代码。阅读其他需要使用命令行工具的地方。结束这个问题。 – WayneH 2010-10-23 15:54:00

回答

1

我认为问题是新版本的ANTLR 3.2.2和ANTLRWorks没有生成正确的代码。阅读其他需要使用命令行工具的地方。结束这个问题。