AttributeError: 'MuParser' object has no attribute 'startRule'
AttributeError: 'MuParser' object has no attribute 'startRule'
所以我从 SO answer:
复制了这段代码
grammar Mu;
parse
: block EOF
;
block
: stat*
;
stat
: assignment
| if_stat
| while_stat
| log
| OTHER {System.err.println("unknown char: " + $OTHER.text);}
;
assignment
: ID ASSIGN expr SCOL
;
if_stat
: IF condition_block (ELSE IF condition_block)* (ELSE stat_block)?
;
condition_block
: expr stat_block
;
stat_block
: OBRACE block CBRACE
| stat
;
while_stat
: WHILE expr stat_block
;
log
: LOG expr SCOL
;
expr
: expr POW<assoc=right> expr #powExpr
| MINUS expr #unaryMinusExpr
| NOT expr #notExpr
| expr op=(MULT | DIV | MOD) expr #multiplicationExpr
| expr op=(PLUS | MINUS) expr #additiveExpr
| expr op=(LTEQ | GTEQ | LT | GT) expr #relationalExpr
| expr op=(EQ | NEQ) expr #equalityExpr
| expr AND expr #andExpr
| expr OR expr #orExpr
| atom #atomExpr
;
atom
: OPAR expr CPAR #parExpr
| (INT | FLOAT) #numberAtom
| (TRUE | FALSE) #booleanAtom
| ID #idAtom
| STRING #stringAtom
| NIL #nilAtom
;
OR : '||';
AND : '&&';
EQ : '==';
NEQ : '!=';
GT : '>';
LT : '<';
GTEQ : '>=';
LTEQ : '<=';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
MOD : '%';
POW : '^';
NOT : '!';
SCOL : ';';
ASSIGN : '=';
OPAR : '(';
CPAR : ')';
OBRACE : '{';
CBRACE : '}';
TRUE : 'true';
FALSE : 'false';
NIL : 'nil';
IF : 'if';
ELSE : 'else';
WHILE : 'while';
LOG : 'log';
ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;
INT
: [0-9]+
;
FLOAT
: [0-9]+ '.' [0-9]*
| '.' [0-9]+
;
STRING
: '"' (~["\r\n] | '""')* '"'
;
COMMENT
: '#' ~[\r\n]* -> skip
;
SPACE
: [ \t\r\n] -> skip
;
OTHER
: .
;
我通过以下方式将代码编译成 python:antlr4 -Dlanguage=Python3 Mu.g4
然后我使用生成的 python 类:
尝试 运行 一个 python 脚本
import sys
from antlr4 import *
from MuLexer import MuLexer
from MuParser import MuParser
def main(argv):
input_stream = FileStream(argv[1])
lexer = MuLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = MuParser(stream)
tree = parser.startRule()
if __name__ == '__main__':
main(sys.argv)
我这样调用该脚本:python3 script.py test.txt
但是输出是:AttributeError: 'MuParser' object has no attribute 'startRule'
我不明白为什么会这样,我所有的代码都是从教程中复制的。
正如评论中已经提到的,在您的情况下,startRule
应该替换为 parse
。该方法对应语法中的如下解析器规则:
parse
: block EOF
;
语法中的每条规则都可以转换为 method/function 您可以调用。您通常希望使用末尾具有 EOF
(文件末尾)标记的规则:这样您就可以强制解析器使用输入流中的所有标记。
要打印解析树的字符串表示,请添加:
print(tree.toStringTree(recog=parser))
所以我从 SO answer:
复制了这段代码grammar Mu;
parse
: block EOF
;
block
: stat*
;
stat
: assignment
| if_stat
| while_stat
| log
| OTHER {System.err.println("unknown char: " + $OTHER.text);}
;
assignment
: ID ASSIGN expr SCOL
;
if_stat
: IF condition_block (ELSE IF condition_block)* (ELSE stat_block)?
;
condition_block
: expr stat_block
;
stat_block
: OBRACE block CBRACE
| stat
;
while_stat
: WHILE expr stat_block
;
log
: LOG expr SCOL
;
expr
: expr POW<assoc=right> expr #powExpr
| MINUS expr #unaryMinusExpr
| NOT expr #notExpr
| expr op=(MULT | DIV | MOD) expr #multiplicationExpr
| expr op=(PLUS | MINUS) expr #additiveExpr
| expr op=(LTEQ | GTEQ | LT | GT) expr #relationalExpr
| expr op=(EQ | NEQ) expr #equalityExpr
| expr AND expr #andExpr
| expr OR expr #orExpr
| atom #atomExpr
;
atom
: OPAR expr CPAR #parExpr
| (INT | FLOAT) #numberAtom
| (TRUE | FALSE) #booleanAtom
| ID #idAtom
| STRING #stringAtom
| NIL #nilAtom
;
OR : '||';
AND : '&&';
EQ : '==';
NEQ : '!=';
GT : '>';
LT : '<';
GTEQ : '>=';
LTEQ : '<=';
PLUS : '+';
MINUS : '-';
MULT : '*';
DIV : '/';
MOD : '%';
POW : '^';
NOT : '!';
SCOL : ';';
ASSIGN : '=';
OPAR : '(';
CPAR : ')';
OBRACE : '{';
CBRACE : '}';
TRUE : 'true';
FALSE : 'false';
NIL : 'nil';
IF : 'if';
ELSE : 'else';
WHILE : 'while';
LOG : 'log';
ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;
INT
: [0-9]+
;
FLOAT
: [0-9]+ '.' [0-9]*
| '.' [0-9]+
;
STRING
: '"' (~["\r\n] | '""')* '"'
;
COMMENT
: '#' ~[\r\n]* -> skip
;
SPACE
: [ \t\r\n] -> skip
;
OTHER
: .
;
我通过以下方式将代码编译成 python:antlr4 -Dlanguage=Python3 Mu.g4
然后我使用生成的 python 类:
尝试 运行 一个 python 脚本import sys
from antlr4 import *
from MuLexer import MuLexer
from MuParser import MuParser
def main(argv):
input_stream = FileStream(argv[1])
lexer = MuLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = MuParser(stream)
tree = parser.startRule()
if __name__ == '__main__':
main(sys.argv)
我这样调用该脚本:python3 script.py test.txt
但是输出是:AttributeError: 'MuParser' object has no attribute 'startRule'
我不明白为什么会这样,我所有的代码都是从教程中复制的。
正如评论中已经提到的,在您的情况下,startRule
应该替换为 parse
。该方法对应语法中的如下解析器规则:
parse
: block EOF
;
语法中的每条规则都可以转换为 method/function 您可以调用。您通常希望使用末尾具有 EOF
(文件末尾)标记的规则:这样您就可以强制解析器使用输入流中的所有标记。
要打印解析树的字符串表示,请添加:
print(tree.toStringTree(recog=parser))