我一直在研究关于这个问题的已经存在的问题,但似乎仍然无法理解它。我有一部分语法
/* Variable Declaration */
var_decl_list : var_decl (var_decl_tail) ;
var_decl : var_type id_list ';' | empty ; //error on this line
var_type : FLOAT | INT;
any_type : var_type | VOID ;
id_list : id id_tail ;
id_tail : ',' id id_tail | empty ;
var_decl_tail : var_decl var_decl_tail | var_decl_tail ;
它告诉我“(201):永远无法匹配以下替代方案:2”,我搞砸了事情已经让它说出了关于 FLOAT 和 INT 的具体内容。antlr railraoad 视图没有多大帮助。完整的语法是
empty : ;
/* Program */
program : PROGRAM id BEGIN pgm_body END ;
id : IDENTIFIER ;
pgm_body : decl func_declarations ;
decl : string_decl_list (decl) | var_decl_list (decl) | empty ;
/* Global String Declaration */
string_decl : STRING id ':=' str ';' | empty ;
string_decl_list : string_decl (string_decl_tail) ;
str : STRINGLITERAL ;
string_decl_tail : string_decl string_decl_tail | string_decl ;
/* Variable Declaration */
var_decl_list : var_decl (var_decl_tail) ;
var_decl : var_type id_list ';' | empty ;
var_type : FLOAT | INT;
any_type : var_type | VOID ;
id_list : id id_tail ;
id_tail : ',' id id_tail | empty ;
var_decl_tail : var_decl var_decl_tail | var_decl_tail ;
/* Function Paramater List */
param_decl_list : param_decl param_decl_tail ;
param_decl :var_type id ;
param_decl_tail : ',' param_decl param_decl_tail | empty ;
/* Function Declarations */
func_declarations : func_decl (func_decl_tail) ;
func_decl : FUNCTION any_type id '('(param_decl_list)')' BEGIN func_body END | empty ;
func_decl_tail : func_decl func_decl_tail | func_decl ;
func_body : decl stmt_list ;
/* Statement List */
stmt_list : stmt stmt_tail | empty ;
stmt_tail : stmt stmt_tail | empty ;
stmt : base_stmt | if_stmt | repeat_stmt ;
base_stmt : assign_stmt | read_stmt | write_stmt | return_stmt ;
/* Basic Statements */
assign_stmt : assign_expr ';' ;
assign_expr : id ':=' expr ;
read_stmt : READ '(' id_list ')'';' ;
write_stmt : WRITE '(' id_list ')'';' ;
return_stmt : RETURN expr ';' ;
/* Expressions */
expr : factor expr_tail ;
expr_tail : addop factor expr_tail | empty ;
factor : postfix_expr factor_tail ;
factor_tail : mulop postfix_expr factor_tail | empty ;
postfix_expr : primary | call_expr ;
call_expr : id '(' expr_list ')' | id '(' ')' ;
expr_list : expr expr_list_tail ;
expr_list_tail : ',' expr expr_list_tail | empty ;
primary : '('expr')' | id | INTLITERAL | FLOATLITERAL ;
addop : '+' | '-' ;
mulop : '*' | '/' ;
/* Complex Statements and Condition */
if_stmt : IF '(' cond ')' THEN (decl) stmt_list else_part ENDIF ;
else_part : 'ELSE' (decl) stmt_list | empty ;
cond : expr compop expr ;
compop : '<' | '>' | '=' | '!=' ;
repeat_stmt : REPEAT (decl) stmt_list UNTIL '(' cond ')'';' ;