gpt4 book ai didi

python - 这个示例 ANTLR 3 Python 语法有什么问题?

转载 作者:行者123 更新时间:2023-11-30 23:45:18 24 4
gpt4 key购买 nike

我正在尝试学习使用 ANTLR,并且在遵循此“教程”时似乎遇到了错误: https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3

本质上,我创建了文件 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: '@'

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

最佳答案

您使用了错误的Tool类来生成词法分析器和解析器。大多数 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 代码:

grammar SimpleCalc;

options {
language=Python;
}

@header {
import sys
import traceback

from SimpleCalcLexer import SimpleCalcLexer
}

@main {
def main(argv, otherArg=None):
char_stream = ANTLRStringStream(sys.argv[1])
lexer = SimpleCalcLexer(char_stream)
tokens = CommonTokenStream(lexer)
parser = SimpleCalcParser(tokens);

try:
print parser.eval()
except RecognitionException:
traceback.print_stack()
}

eval returns [value]
: add EOF {$value = $add.value}
;

add returns [value]
: m1=mult {$value = $m1.value} ( '+' m2=mult {$value += $m2.value}
| '-' m2=mult {$value -= $m2.value}
)*
;

mult returns [value]
: a1=atom {$value = $a1.value} ( '*' a2=atom {$value *= $a2.value}
| '/' a2=atom {$value /= $a2.value}
)*
;

atom returns [value]
: NUMBER {$value = float($NUMBER.text)}
| '(' add ')' {$value = $add.value}
;

NUMBER : DIGIT+ ('.' DIGIT*)?;
WHITESPACE : ('\t' | ' ' | '\r' | '\n')+ {$channel = HIDDEN;};
fragment DIGIT : '0'..'9' ;

生成词法分析器/解析器并评估表达式:

java -cp antlr-3.1.3.jar org.antlr.Tool SimpleCalc.g
python SimpleCalcParser.py "5 * (8 + 2)"

产生输出:

50.0

关于python - 这个示例 ANTLR 3 Python 语法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9611668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com