Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这个例子AntlR3Python语法有什么问题?_Python_Antlr_Antlr3 - Fatal编程技术网

什么';这个例子AntlR3Python语法有什么问题?

什么';这个例子AntlR3Python语法有什么问题?,python,antlr,antlr3,Python,Antlr,Antlr3,我正在尝试学习使用ANTLR,在遵循本“教程”时似乎遇到了一个错误: 基本上,我创建了SimpleCalc.g文件: grammar SimpleCalc;   options {     language = Python; }   tokens {     PLUS    = '+' ;     MINUS   = '-' ;     MULT    = '*' ;     DIV = '/' ; }   @header { import sys import traceback   fr

我正在尝试学习使用ANTLR,在遵循本“教程”时似乎遇到了一个错误:

基本上,我创建了SimpleCalc.g文件:

grammar SimpleCalc;
 
options {
    language = Python;
}
 
tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    MULT    = '*' ;
    DIV = '/' ;
}
 
@header {
import sys
import traceback
 
from SimpleCalcLexer import SimpleCalcLexer
}
 
@main {
def main(argv, otherArg=None):
  char_stream = ANTLRFileStream(sys.argv[1])
  lexer = SimpleCalcLexer(char_stream)
  tokens = CommonTokenStream(lexer)
  parser = SimpleCalcParser(tokens);
 
  try:
        parser.expr()
  except RecognitionException:
    traceback.print_stack()
}
 
/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
 
expr    : term ( ( PLUS | MINUS )  term )* ;
 
term    : factor ( ( MULT | DIV ) factor )* ;
 
factor  : NUMBER ;
 
 
/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
 
NUMBER  : (DIGIT)+ ;
 
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;
 
fragment DIGIT  : '0'..'9' ;
当我运行ANTLR工具时

 java -classpath antlr-3.1.3.jar antlr.Tool SimpleCalc.g
我收到错误,从第一行开始:

ANTLR Parser Generator   Version 2.7.7 (20060906)   1989-2005
SimpleCalc.g:2:1: unexpected token: grammar
error: Token stream error reading grammar(s):
SimpleCalc.g:15:1: unexpected char: '@'
SimpleCalc.g:2:1: rule grammar trapped:
SimpleCalc.g:2:1: unexpected token: grammar
TokenStreamException: unexpected char: '@'

这让我相信我在做一些愚蠢的事情,但我不确定是什么。

您使用了错误的
工具
类来生成lexer和parser。大多数ANTLR 3.x版本仍然与旧的v2.7版本有依赖关系,因此包含在v3.x中。v2.7中的
Tool
类称为
antlr.Tool
,而v3.x版本称为
org.antlr.Tool
。后者是您应该使用的:

java-classpath antlr-3.1.3.jar org.antlr.Tool SimpleCalc.g
编辑 下面是一个基于Wiki语法的小演示,但添加了一些Python代码来计算表达式:

语法SimpleCalc;
选择权{
语言=Python;
}
@标题{
导入系统
导入回溯
从SimpleCalcLexer导入SimpleCalcLexer
}
@主要{
def main(argv,其他arg=None):
char_stream=ANTLRStringStream(sys.argv[1])
lexer=SimpleCalcLexer(字符流)
令牌=公共令牌流(lexer)
解析器=SimpleCalcParser(令牌);
尝试:
print parser.eval()
除认可例外:
traceback.print_stack()
}
评估返回值[值]
:添加EOF{$value=$add.value}
;
添加返回值[值]
:m1=mult{$value=$m1.value}('+'m2=mult{$value+=$m2.value}
|“-”m2=mult{$value-=$m2.value}
)* 
;
mult返回[值]
:a1=atom{$value=$a1.value}('*'a2=atom{$value*=$a2.value}
|“/”a2=原子{$value/=$a2.value}
)* 
;
原子返回[值]
:NUMBER{$value=float($NUMBER.text)}
|“('add')”{$value=$add.value}
;
数字:数字+('.'数字*)?;
空白:('\t'.'''.''.'\r'.'\n')+{$channel=HIDDEN;};
片段数字:“0”…'9';
生成词法分析器/解析器并计算表达式:

java-cp antlr-3.1.3.jar org.antlr.Tool SimpleCalc.g
python SimpleCalParser.py“5*(8+2)”
生成输出:

50.0

Antlr类是
org.Antlr.Tool
,但这必须是一个复制/粘贴错误,因为它甚至不会以该错误开头。错误消息指向第2行——输入语法的第1行是什么?你还没把一切都展示出来,我真傻。我假设AntlR3jar没有附带AntlR2。