簡體   English   中英

Yacc-使用%union和鏈表建立數據結構

[英]Yacc - Building data structures using %union and linked-list

我正在嘗試使用yacc在程序中構建特殊的數據結構,這是我語法的一部分:

commands      : commands command    {if($$ == 0){$$ = &$2;}
                                     struct Command* ptr = $$;
                                     while(ptr->next != 0){ ptr=ptr->next;} ptr->next = &$2;
                                     }
                  |                  {$$= 0;}
                  ;

command       : identifier ASSGNOP expression';'  {$$.id = $1; $$.exp=$3; $$.next = 0; }
              | IF condition THEN commands ENDIF  {$$.next = $4;  = $2; $4 = &$$; }
              ;

我希望我的程序在執行時創建鏈接列表。

%type <Command> command
%type <Commands> commands

     //..part in union%{
    struct Command {
        struct Command * next;
        struct Expression exp;
        char*  id;

        struct Condition cond;  
        int licznik;

        }Command;

       struct Command* Commands;         
    }

該列表應通過將命令連接在一起來增加。 最后,應該返回一個指向整個結構列表的指針。 不幸的是,我遇到了“分段”錯誤。 再加上它會永遠迭代,永遠不會遇到NULL。 如果有人將我指向我做錯的地方,我將不勝感激。 當我刪除ptr = ptr-> next時; 它正在工作,但我不明白為什么會這樣。 最后應該指向NULL。

are kept on the parser stack. 語義值$ 保留在解析器堆棧中。 它們不占用持久性內存,並且獲取地址通常是錯誤的。 在執行語義動作之后,將立即從堆棧中彈出它們,並且指向它們的任何指針都將變為無效。

如果要創建語義對象的鏈接列表,則需要手動分配內存,並將語義值設置為已分配對象的地址。

順便說一句,通過僅將每個新節點推入列表的開頭,然后在完成后反轉列表,可以向后構建列表。 這樣可以避免每次推送時對列表進行二次掃描。

暫無
暫無

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

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