簡體   English   中英

野牛:由於沖突,規則在解析器中無用[-Wother]

[英]Bison: rule useless in parser due to conflicts [-Wother]

我有這個語法,應該從Java代碼中生成Java字節代碼。 我知道以前已經在許多問題中解決了此警告,但是我找不到與我類似的問題。 它特別針對這兩個規則顯示此警告:

statement_list: 
    {
        $<stmt_type>$.next = $<stmt_type>0.next;
    }
     statement 
    | 
    {
        $<stmt_type>$.next = strdup(genLabel().c_str());    //generate label for statement and assign it to statement list next
    }
    statement_list 
    {
        $<stmt_type>$.next = $<stmt_type>0.next;
        fout<<$<stmt_type>1.next<<":"<<endl;    //mark statement with statement list next label
    }
    statement 
    ;

還有這個

b_expression:
expression RELA_OP expression       
    {$$ = $<bexpr_type>0;relaCast(string($2),$$.nTrue,$$.nFalse);}
|{/* addding some strings to this action */ } b_expression BOOL_OP b_expression

我需要在分析每個語句之前將其標記為下一個語句,以在代碼生成中使用它。 當我從statement_list中刪除語義動作時,它的錯誤消失了,但是我沒有對b_expression嘗試相同的操作。

野牛只預取1個令牌來決定要應用哪個生產。 在解析器讀取任何令牌以知道將應用哪個生產之前,您的兩個for語句生產都具有代碼塊。

如果您要直接在yacc規則中生成帶有標簽的類似於程序集的堆棧代碼,則通常使用以下方法:

if_statement: IF condition {
                      $$ = gen_label();
                      gen_code(JUMP_FALSE, $$); }
              THEN block {
                      $$ = gen_label();
                      gen_code(JUMP, $$);
                      gen_code(LABEL, $3); }
              ELSE block {
                      gen_code(LABEL, $6); }

while_statement: WHILE { gen_code(LABEL, $$ = gen_label()); }
                 condition { gen_code(JUMP_FALSE, $$ = gen_label); }
                 block { gen_code(JUMP, $2); gen_code(LABEL, $4); }

如果直接生成字節碼,則沒有這樣的“標簽”-當生成前向分支時,您會記住字節碼中目標偏移量應到達的位置以及到達目標位置的位置會輸出標簽,然后對分支進行后修補以跳轉到當前位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM