2

yy_scan_stringandを使用しyyparse()て、テキストを解析します。構文エラーが表示されたときに次の文字列の解析を続行したいのですが、うまくいきません。

yacc ファイルの抜粋:

set:SET PARENTHESIS reference EQUAL expression CLOSE_PARENTHESIS {$$ = set_directive($3,$5); }
|error { printf("set error abourt!");YYACCEPT;}//when appears error,I want to continue parsing the next string.I hava used YYABORT,but it not work as I want
;
...

int main(){

 yy_scan_string("#set($b ==9)"); //this string has syntax error.
    yyparse();
    yylex_destroy();
    printf("=====================11111========================\n");

    traverse(snode); //print the ast
    free_tree(snode); // release the memory


    yy_scan_string("#if($r==5) wewqewqe #end"); //this string is right,I want to continue to parse this after paser the string on it: "#set($b ==9)"
    yyparse();
    yylex_destroy();
    printf("=====================222222========================\n");

    traverse(snode);
    free_tree(snode);

    return 1;
}

int yywrap(){
    return 1;
}


int yyerror(char* s){
    printf("=====================error %s========================\n",s);
    //reset_input();
    //yyclearin;

    return 0;
}

どうすればいいですか、助けてください!

4

1 に答える 1

2

エラー回復では、知っておくべきいくつかのプリンシパルがあります。

  • errorリダクションの代わりにトークンを追加する必要があります (完了)
  • エラーがOKであることをパーサーに伝える必要があり、それを呼び出しますyyerrok(まだ行われていません)
  • yyclearin を使用して現在のトークンを破棄することもできます

    PS; 実行の年表:

    エラーの場合、yyerror が呼び出され、yyerrstate が 1 に等しくなり、その後 yyerrok が呼び出され、エラー ステータスが 0 で再初期化されます。その後、任意のマクロを呼び出すことができます...

      |error { yyerrok; yyclearin;printf("set error abourt!");}
      ;
    
于 2013-06-04T08:57:12.727 に答える