Parsing 编译分析器规则时出错
我拥有的解析器代码:Parsing 编译分析器规则时出错,parsing,computer-science,antlr4,lexer,Parsing,Computer Science,Antlr4,Lexer,我拥有的解析器代码: funcall: ID LB exp? RB ; exp: funcall | INTLIT ; 然后,我的作业要求我对“funcall”这样做: 调用表达式是一种函数调用,它以标识符开头,后跟“(“and”)”。在“(“and”)”之间可能会出现一个以逗号分隔的表达式列表,该列表可能是一个参数列表 对于“exp”,它必须遵循优先级和关联性: 因此,我尝试这样编写代码以符合要求(我不太确定“funcall”之后的文字顺序,因为作业中没有提到它): funcall:ID
funcall: ID LB exp? RB ;
exp: funcall | INTLIT ;
然后,我的作业要求我对“funcall”这样做:
调用表达式是一种函数调用,它以标识符开头,后跟“(“and”)”。在“(“and”)”之间可能会出现一个以逗号分隔的表达式列表,该列表可能是一个参数列表
对于“exp”,它必须遵循优先级和关联性:
因此,我尝试这样编写代码以符合要求(我不太确定“funcall”之后的文字顺序,因为作业中没有提到它):
funcall:ID LB(exp(逗号exp)*)?RB;
经验
:LB exp RB
|LSB exp RSB
|(子|非)exp
|exp op=(DIV | MUL | MODUL)exp
|exp op=(添加|子)exp
|exp op=(LT | LTOE | GT | GTOE)exp
|exp op=(等于| NOEQUAL)exp
|经验和经验
|exp或exp
|exp分配exp
|芬考尔
|(INTLIT | FLOATLIT)
|(对|错)
|身份证
|丝光灯;
但后来我遇到了这样的错误,这使我无法将符号*与“(逗号exp)”或甚至“exp”本身一起使用:
下面是生成类ASTGeneration的代码,其中出现错误:
重写def visitFuncall(ctx:FuncallContext)=CallExpr(ctx.ID.getText,if(ctx.exp==null)List()else List(visit(ctx.exp).asInstanceOf[Expr]))
这是我的lexer代码,涉及:
LB: '(' ;
RB: ')' ;
LP: '{' ;
RP: '}' ;
SEMI: ';' ;
LSB: '[' ;
RSB: ']' ;
COMMA: ',' ;
ADD: '+' ;
SUB: '-' ;
MUL: '*' ;
DIV: '/' ;
OR: '||' ;
AND: '&&' ;
NOT: '!' ;
NOEQUAL: '!=' ;
EQUAL: '==' ;
MODUL: '%' ;
ASSIGN: '=' ;
LT: '<' ;
LTOE: '<=' ;
GT: '>' ;
GTOE: '>=' ;
TRUE: 'true' ;
FALSE: 'false' ;
INTLIT: [0-9]+ ;
FLOATLIT: INTLIT DOT INTLIT ;
fragment DOT: '.' ;
ID: [_a-zA-Z] [_a-zA-Z0-9]* ;
STRINGLIT: '"' ('\\' [bfrnt'"\\] | ~[\b\f\r\n\t'"\\])*; '"' ;
WS : [ \t\r\n]+ -> skip ;
LB:'(';
RB:')';
LP:“{”;
RP:'}';
半:';';
LSB:“[”;
RSB:“]”;
逗号:',';
加:“+”;
SUB:“-”;
MUL:“*”;
分区:“/”;
或:“| |”;
及:"&";
不是:“!”;
NOEQUAL:“!=”;
相等:'=';
模:'%1!';
分配:'=';
LT:'=';
真:‘真’;
假:‘假’;
INTLIT:[0-9]+;
FLOATLIT:INTLIT点INTLIT;
碎片点:';
ID:[\u a-zA-Z][\u a-zA-Z0-9]*;
STRINGLIT:“'”(“\\'[bfrnt'\\\]\\].[\b\f\r\n\t'\\]])*”;
WS:[\t\r\n]+->跳过;
任何人都可以告诉我解析器代码中的错误(现在我想知道我的“exp”可能导致“funcall”中的错误)我应该用哪种方法修复它。提前谢谢!!检查生成的代码。由于在
funcall
规则中有多个expr
,funcall上下文类中的expr
成员不是单个节点,而是节点(上下文)列表中,填充了解析过程中出现的expr
解析上下文。我想我可能会检查我的代码,因为您的评论提醒我它们之间的隐式连接。
LB: '(' ;
RB: ')' ;
LP: '{' ;
RP: '}' ;
SEMI: ';' ;
LSB: '[' ;
RSB: ']' ;
COMMA: ',' ;
ADD: '+' ;
SUB: '-' ;
MUL: '*' ;
DIV: '/' ;
OR: '||' ;
AND: '&&' ;
NOT: '!' ;
NOEQUAL: '!=' ;
EQUAL: '==' ;
MODUL: '%' ;
ASSIGN: '=' ;
LT: '<' ;
LTOE: '<=' ;
GT: '>' ;
GTOE: '>=' ;
TRUE: 'true' ;
FALSE: 'false' ;
INTLIT: [0-9]+ ;
FLOATLIT: INTLIT DOT INTLIT ;
fragment DOT: '.' ;
ID: [_a-zA-Z] [_a-zA-Z0-9]* ;
STRINGLIT: '"' ('\\' [bfrnt'"\\] | ~[\b\f\r\n\t'"\\])*; '"' ;
WS : [ \t\r\n]+ -> skip ;