Yacc - 使用 %union 和链表构建数据结构
Yacc - Building data structures using %union and linked-list
我在使用 yacc
时试图在我的程序中构建特殊的数据结构。这是我的语法的一部分:
commands : commands command {if($$ == 0){$$ = &;}
struct Command* ptr = $$;
while(ptr->next != 0){ ptr=ptr->next;} ptr->next = &;
}
| {$$= 0;}
;
command : identifier ASSGNOP expression';' {$$.id = ; $$.exp=; $$.next = 0; }
| IF condition THEN commands ENDIF {$$.next = ; = ; = &$$; }
;
我希望我的程序在执行时创建链表。
%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;
}
列表应该通过将命令连接在一起来增加。最后应该返回一个指向整个结构列表的指针。不幸的是,我遇到了 'segmentation' 故障错误。另外它永远迭代,永远不会遇到 NULL。如果有人指出我做错了什么,我将不胜感激。当我删除 ptr=ptr->next;它正在工作,但我不明白为什么会这样。最后应该指向NULL。
语义值 $<i>n</i>
保存在解析器堆栈中。它们不占用持久内存,获取它们的地址通常是错误的。执行语义动作后,它们将立即从堆栈中弹出,任何指向它们的指针都将失效。
如果要创建语义对象链表,需要手动分配内存,并将语义值设置为分配对象的地址。
顺便说一句,向后构建列表更有效,只需将每个新节点推到列表的头部,然后在完成时反转列表。这避免了每次推送时列表的二次扫描。
我在使用 yacc
时试图在我的程序中构建特殊的数据结构。这是我的语法的一部分:
commands : commands command {if($$ == 0){$$ = &;}
struct Command* ptr = $$;
while(ptr->next != 0){ ptr=ptr->next;} ptr->next = &;
}
| {$$= 0;}
;
command : identifier ASSGNOP expression';' {$$.id = ; $$.exp=; $$.next = 0; }
| IF condition THEN commands ENDIF {$$.next = ; = ; = &$$; }
;
我希望我的程序在执行时创建链表。
%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;
}
列表应该通过将命令连接在一起来增加。最后应该返回一个指向整个结构列表的指针。不幸的是,我遇到了 'segmentation' 故障错误。另外它永远迭代,永远不会遇到 NULL。如果有人指出我做错了什么,我将不胜感激。当我删除 ptr=ptr->next;它正在工作,但我不明白为什么会这样。最后应该指向NULL。
语义值 $<i>n</i>
保存在解析器堆栈中。它们不占用持久内存,获取它们的地址通常是错误的。执行语义动作后,它们将立即从堆栈中弹出,任何指向它们的指针都将失效。
如果要创建语义对象链表,需要手动分配内存,并将语义值设置为分配对象的地址。
顺便说一句,向后构建列表更有效,只需将每个新节点推到列表的头部,然后在完成时反转列表。这避免了每次推送时列表的二次扫描。