野牛错误恢复建议

时间:2018-06-13 21:51:03

标签: c++ compiler-construction bison

我正在尝试将错误恢复集成到我的语法中。从野牛手册中,最简单的错误恢复将跳过当前行。但是在我的flex文件中,我没有关于换行的动作,因此解析器不会知道它。所以我希望解析器忽略所有内容,直到遇到错误时才会出现分号。

我有以下语法:

start : program;

program : program unit 
    | unit
    ;

unit : var_declaration
     | func_declaration
     | func_definition
     ;

func_declaration : type_specifier ID LPAREN parameter_list RPAREN SEMICOLON
        | type_specifier ID LPAREN RPAREN SEMICOLON
        ;

func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement
        | type_specifier ID LPAREN RPAREN compound_statement
        ;               


parameter_list  : parameter_list COMMA type_specifier ID
        | parameter_list COMMA type_specifier
        | type_specifier ID
        | type_specifier
        ;


compound_statement : LCURL statements RCURL
            | LCURL RCURL
            ;

var_declaration : type_specifier declaration_list SEMICOLON
         ;

type_specifier  : INT
        | FLOAT
        | VOID
        ;

declaration_list : declaration_list COMMA ID
          | declaration_list COMMA ID LTHIRD CONST_INT RTHIRD
          | ID
          | ID LTHIRD CONST_INT RTHIRD
          ;

statements : statement
       | statements statement
       ;

statement : var_declaration
      | expression_statement
      | compound_statement
      | FOR LPAREN expression_statement expression_statement expression RPAREN statement
      | IF LPAREN expression RPAREN statement
      | IF LPAREN expression RPAREN statement ELSE statement
      | WHILE LPAREN expression RPAREN statement
      | PRINTLN LPAREN ID RPAREN SEMICOLON
      | RETURN expression SEMICOLON
      ;

expression_statement    : SEMICOLON         
            | expression SEMICOLON 
            ;

variable : ID       
     | ID LTHIRD expression RTHIRD 
     ;

 expression : logic_expression  
       | variable ASSIGNOP logic_expression     
       ;

logic_expression : rel_expression   
         | rel_expression LOGICOP rel_expression    
         ;

rel_expression  : simple_expression 
        | simple_expression RELOP simple_expression 
        ;

simple_expression : term 
          | simple_expression ADDOP term 
          ;

term :  unary_expression
     |  term MULOP unary_expression
     ;

unary_expression : ADDOP unary_expression  
         | NOT unary_expression 
         | factor 
         ;

factor  : variable 
    | ID LPAREN argument_list RPAREN
    | LPAREN expression RPAREN
    | CONST_INT 
    | CONST_FLOAT
    | variable INCOP 
    | variable DECOP
    ;

argument_list : arguments
              |
              ;

arguments : arguments COMMA logic_expression
          | logic_expression
          ;

我目前正在处理以下输入:

int main(){
    int a[2],c,i,j ; float c;
    a[2.5]=1;
    i=2.3
    j=2%3.7;    
    a=4;
    func(a);
    b=8;
    return 0;
}

当解析器遇到i = 2.3时,它不会停止解析,而是在报告语法错误后继续这样做。

基于语法,我应该在哪里放置我的错误生成,以便解析器可以继续解析而不会发生任何冲突?并且可能会对其他语法错误有所了解,例如错过RPAREN或Curly大括号?我应该如何为给定的语法添加错误生成?

0 个答案:

没有答案