[英]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.