Parsing ANTLR4解析器混淆

Parsing ANTLR4解析器混淆,parsing,antlr,antlr4,lexer,Parsing,Antlr,Antlr4,Lexer,我试图为一个项目使用antlr4,但我遇到了一个错误,我不知道如何修复。antlr4似乎与两个解析器规则相混淆。 这是我的lexer/parser: grammar PARSER; @header {package VSOP.Parser;} program : code+ ; //statement+ ; code : classHeader | methodHeader | ; statement

我试图为一个项目使用antlr4,但我遇到了一个错误,我不知道如何修复。antlr4似乎与两个解析器规则相混淆。 这是我的lexer/parser:

grammar PARSER;
@header {package VSOP.Parser;}
program                 : code+ ; //statement+ ;

code                    : classHeader | methodHeader | ;
statement               : assign | ifStatement | whileStatement;

classHeader             : 'class' TYPE_IDENTIFIER ('extends' TYPE_IDENTIFIER)? '{' classBody '}';
classBody               : methodHeader* | field*;

methodHeader            : OBJECT_IDENTIFIER '(' (((formal ',')+ (formal)) | (formal)?) ')' ':' varType '{' methodBody '}' ;
methodBody              : statement* ;
formal                  : OBJECT_IDENTIFIER ':' varType ;
field                   : OBJECT_IDENTIFIER ':' varType ('<-' varValue)? ';' ;



assign                  : OBJECT_IDENTIFIER ':' varType ('<-' varValue)? ;

whileStatement          : 'while' condition* 'do' statement* ;

ifStatement             : ifStat elseStat? ; //ifStat elseIfStat* elseStat? ;
ifStat                  : 'if' condition 'then' statement* ;
//elseIfStat              : 'else if' condition 'then' '{' statement* '}' ;
elseStat                : 'else' statement* ;

condition               : comparaiser CONDITIONAL_OPERATOR comparaiser ;
comparaiser             : OBJECT_IDENTIFIER | integer | STRING ;
integer                 : INTEGER_HEX | INTEGER_DEC | INTEGER_BIN ;
varType                 : 'bool' | 'int32' | 'string' | 'unit' | TYPE_IDENTIFIER ;
varValue                : ('true' | 'false' | STRING | integer) ;


   // KEYWORD                 : 'and' | 'class' | 'do' | 'else' | 'extends' | 'false' | 'if' | 'in' | 'isnull' | 'let' | 'new' | 'not' | 'then' | 'true' | 'unit' | 'while' ;
ARITHMETIC_OPERATOR     : '+' | '-' | '*' | '/' | '^' ;
CONDITIONAL_OPERATOR    : '=' | '<' | '<=';
MULTILINE_OPEN_COMMENT  : '(*' ;
MULTILINE_CLOSE_COMMENT : '*)' ;
MULTILINE_COMMENT       : '(*' .*? '*)' ;
INTEGER_BIN             : '0'[bB][0-9a-zA-Z]* ;
INTEGER_HEX             : '0'[xX][0-9a-zA-Z]* ;
INTEGER_DEC             : [0-9][0-9a-zA-Z]* ;

OBJECT_IDENTIFIER       : [a-z][a-zA-Z0-9_]* ;
TYPE_IDENTIFIER         : [A-Z][a-zA-Z0-9_]* ;
STRING                  : '"' ( '\\"' | . )*? ('"' | EOF) ;
SINGLE_LINE_COMMENT     : '//'~[\r\n]* ;
WS                      : [ \r\n\t]+ -> skip;
你知道怎么解决这个问题吗?
谢谢

您可以将
classBody
定义为字段定义序列或方法定义序列。你不允许它是两者的序列


如果将其改为
(methodHeader | field)*
,您将得到一个可以包含其中任何一个的序列。

您将
类体定义为字段定义序列或方法定义序列。你不允许它是两者的序列


如果将其改为
(methodHeader | field)*
,您将得到一个可以包含其中任何一个的序列。

我在解析器中发现了问题。问题来自于类主体

    classBody               : methodHeader* | field*;
相反,我写了:

    classHeader             : 'class' TYPE_IDENTIFIER ('extends' TYPE_IDENTIFIER)? '{' classBody* '}';
    classBody               : methodHeader | field;

我在解析器中发现了问题。问题来自于类主体

    classBody               : methodHeader* | field*;
相反,我写了:

    classHeader             : 'class' TYPE_IDENTIFIER ('extends' TYPE_IDENTIFIER)? '{' classBody* '}';
    classBody               : methodHeader | field;

非常感谢。我在你发布之前1分钟发现了错误,我正在和你同时编写解决方案。谢谢。我在你发布之前1分钟发现了这个错误,我正在和你同时编写解决方案。