Bison 解析器深入解析与应用技巧
1. 递归语法与栈大小控制
在某些情况下,一个包含 5000 条语句的程序会被解析为一个包含 10000 个元素(语句和分号)的列表。对于大多数 Bison 解析器来说,一个 10000 元素的右递归列表太大了。右递归语法适用于已知较短且希望转换为值链表的项列表,例如:
thinglist: THING { $$ = $1; }
| THING thinglist { $1->next = $2; $$ = $1; }
;
而左递归语法可能会使列表以逆序链接,需要在最后进行反转步骤,或者在每个阶段都需要额外的代码来查找列表的末尾以添加下一个元素。
可以通过定义 YYINITDEPTH 和 YYMAXDEPTH 来控制解析器栈的大小。 YYINITDEPTH 是初始栈大小,通常为 200; YYMAXDEPTH 是最大栈大小,通常为 10000。示例代码如下:
%{
#define YYMAXDEPTH 50000
%}
每个栈条目包括语义值的大小( %union 条目中的最大大小)、两个字节的令牌编号,如果使用位置信息,还包括 16 字节的位置信息。在具有千兆字节虚拟内存的工作站上,100000 个条目的栈大约为 2 到 3 兆字节,是可以管理的;但在较小的嵌入式系统中,可能需要重写语法以限制栈大小。
超级会员免费看
订阅专栏 解锁全文
3

被折叠的 条评论
为什么被折叠?



