Parsing 输入antlr没有可行的替代方案
我必须使用ANTLR为Python做一个lexer和一个解析器,但是当我使用这个输入运行时: print 99出现此错误:“输入print99时没有可行的替代方案”。 为什么把这些放在一起?? 我真的需要你的帮助。 我什么都试过了,但我不知道哪里出了问题Parsing 输入antlr没有可行的替代方案,parsing,python-3.x,input,antlr,lexer,Parsing,Python 3.x,Input,Antlr,Lexer,我必须使用ANTLR为Python做一个lexer和一个解析器,但是当我使用这个输入运行时: print 99出现此错误:“输入print99时没有可行的替代方案”。 为什么把这些放在一起?? 我真的需要你的帮助。 我什么都试过了,但我不知道哪里出了问题 ***This is my Lexer:*** lexer grammar LexerPython; options { language=Python3; } fragment L : [a-z]; fragment D : [
***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 ;
***这是我的Lexer:***
词缀语法;
选择权{
语言=蟒蛇3;
}
片段L:[a-z];
片段D:[0-9];
数字:“0”|([1-9]D*);
ID:L(L | D)*;
//帕拉布拉斯酒店
DEF:‘DEF’;
如果:‘如果’;
ELSE:‘ELSE’;
//整数
//串
蓝:‘蓝’;
RETURN:‘RETURN’;
打印:“打印”;
WHILE:‘WHILE’;
缩进:'\t';
DEDENT:“DEDENT”;
换行符:'\r\n';
//SIMBOLOS NUMERICOS
苏玛:“+”;
RESTA:'-';
乘法:'*';
分部:“/”;
市长:“>”;
MENOR:'=';
MENOR_IGUAL:'您的解析器不处理我可以看到的命令之间的空格。你只是跳过了所有空格,但是空格在命令之间很重要。我是怎么做到的??像这样,例如:printstation:PRINT“”表达式;像这样??它可能像:ifstatement:IF-WS-expression-DOS\u-PUNTOS-sequence-WS-ELSE-DOS\u-PUNTOS-sequence代码>。您已经定义了WS
,所以不要跳过它,只需调整语法即可。你可能还需要一个可选的空格。不像你说的那样。抛出这个错误:在输入“print”时没有可行的替代方案。我的输入是打印“hello”,如果您自己编写了这段代码,您应该可以调整它以考虑空格。你自己解决吧。我不会为你解决这个问题;我在提建议。另一方面,因为这是针对Python3的,所以需要括号。例如:print(“hello”)