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 ;