我必须使用ANTLR为Python执行词法分析器和解析器,但是当我使用此输入运行时: print 99出现此错误:"输入print99"没有可行的替代方案。 为什么要把所有的一起 我真的需要你的帮助。 我尝试了一切,我不知道什么是错的。
***This is my Lexer:***
lexer grammar LexerPython;
options {
language=Python3;
}
fragment L : [a-z];
fragment D : [0-9];
NUM : '0' | ([1-9] D*);
ID : L (L|D)*;
//PALABRAS RESERVADAS
DEF : 'def';
IF : 'if' ;
ELSE : 'else' ;
//INTEGER
//STRING
LEN : 'len' ;
RETURN : 'return' ;
PRINT : 'print' ;
WHILE : 'while' ;
INDENT : '\t' ;
DEDENT : 'dedent' ;
NEWLINE : '\r\n' ;
//SIMBOLOS NUMERICOS
SUMA : '+' ;
RESTA : '-' ;
MULTIPLICACION : '*' ;
DIVISION : '/' ;
MAYOR : '>' ;
MENOR : '<' ;
MAYOR_IGUAL : '>=' ;
MENOR_IGUAL : '<=' ;
IGUAL : '=' ;
IGUAL_IGUAL : '==' ;
//OTROS SIMBOLOS
COMA : ',' ;
DOS_PUNTOS : ':' ;
PARENTESIS_ABIERTO : '(' ;
PARENTESIS_CERRADO : ')' ;
CORCHETE_ABIERTO : '[' ;
CORCHETE_CERRADO : ']' ;
WS : ' '+ -> skip ;
***And this is my PARSER:***
program : statement (statement)* ;
statement : defstatement | ifstatement | returnstatement | printstatement | whilestatement | assignstatement | functioncallstatement ;
defstatement : DEF ID PARENTESIS_ABIERTO arglist PARENTESIS_CERRADO DOS_PUNTOS sequence ;
arglist : ID (COMA ID)* ;
moreargs : ID ;
ifstatement : IF expression DOS_PUNTOS sequence ELSE DOS_PUNTOS sequence ;
whilestatement : WHILE expression DOS_PUNTOS sequence ;
returnstatement : RETURN expression NEWLINE ;
printstatement : PRINT expression NEWLINE ;
assignstatement : ID IGUAL expression NEWLINE ;
functioncallstatement : primitiveexpression PARENTESIS_ABIERTO expressionlist PARENTESIS_CERRADO NEWLINE ;
sequence : NEWLINE INDENT morestatements DEDENT ;
morestatements : statement (statement)* ;
expression : additionexpression comparison ;
comparison : (MENOR|MAYOR|MENOR_IGUAL|MAYOR_IGUAL|IGUAL_IGUAL)
additionexpression (comparison)* ;
additionexpression : multiplicationexpression additionfactor ;
additionfactor : (SUMA|RESTA) multiplicationexpression (additionfactor)* ;
multiplicationexpression : elementexpression multiplicationfactor ;
multiplicationfactor : (MULTIPLICACION|DIVISION) elementexpression (multiplicationfactor)* ;
elementexpression : primitiveexpression elementaccess ;
elementaccess : CORCHETE_ABIERTO expression CORCHETE_CERRADO (elementaccess)* ;
//functioncallexpression : primitiveexpression ( expressionlist ) ;
expressionlist : expression (COMA expression)* ;
moreexpressions : expression ;
primitiveexpression : NUM | ID | PARENTESIS_ABIERTO expression PARENTESIS_CERRADO | listexpression | LEN PARENTESIS_ABIERTO expression PARENTESIS_CERRADO | /*functioncallexpression*/ ;
listexpression : CORCHETE_ABIERTO expressionlist CORCHETE_CERRADO ;