一个base check next 的问题
参考
http://www.opensubscriber.com/me ... u.org/11185501.html
http://www.opensubscriber.com/me ... u.org/13617870.html
我确认下面这两行删除会有问题, 但是不知道原因, 哪位看过这段代码么?
看byacc, 就差这几行
static base_number
pack_vector (vector_number vector)
{
vector_number i = order[vector];
int j;
int t = tally;
int loc = 0;
base_number *from = froms;
base_number *to = tos;
unsigned int *conflict_to = conflict_tos;
aver (t != 0);
for (j = lowzero - from[0]; ; j++)
{
int k;
bool ok = true;
aver (j < table_size);
for (k = 0; ok && k < t; k++)
{
loc = j + state_number_as_int (from[k]);
if (table_size <= loc)
table_grow (loc);
if (table[loc] != 0)
ok = false;
}
for (k = 0; ok && k < vector; k++)
if (pos[k] == j)
ok = false;
I don't know this code's role!!! ------------------
delete it bison can complete it's task. ------------------
if (ok)
{
for (k = 0; k < t; k++)
{
loc = j + from[k];
table[loc] = to[k];
if (nondeterministic_parser && conflict_to != NULL)
conflict_table[loc] = conflict_to[k];
check[loc] = from[k];
}
while (table[lowzero] != 0)
lowzero++;
if (loc > high)
high = loc;
aver (BASE_MINIMUM <= j && j <= BASE_MAXIMUM);
return j;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
今天突然想起来了
这个check是由3个表合并在一起,yysindex yygindex, yyrindex都指向它
如果两个base相同,那么可能会误用别人的next
汗,别让我自卑了
for (k = 0; ok && k < vector; k++)
if (pos[k] == j)
ok = false;
I don't know this code's role!!! ------------------
delete it bison can complete it's task. ------------------
biosn和byacc基本是一模一样的,没有不一样。我给byacc的作者问了,没响应,所以去问bison
这两行是别人写的,没有找到回复,这也是我要问的,只是这哥们以为可以删除,我一开始也以为可以删除,估计这哥们测试的例子比较简单,比如用自带的calc.y, 我用本版精华的C文法测试,也发现删除不删除这段代码都能工作。但是用bash-4.0的parse.y测试了一把,发现如果注释这3行代码bash的parser就出错了,显然,这几行是有用的,本来想调试,但是发现太痛苦了。
不知道 为什么两个状态的转换表的base必须不相等(那三行代码), 如果你没看过代码估计一下子也不知道
check[base[s]+token_value] == s不就行了吗,干嘛还要求base不等
哇!lz在看bison/byacc!我没看过,提供一点思路吧,不一定帮的上你。
既然这个代码是bison和byacc的不同,那么bison和byacc在使用相关功能的时候有什么不同么?
yacc是生成shift reduce的跳转表,这个代码在tables.c里面,肯定是跳转表的信息了。我第一次看,还没明白这段代码的意思,一起讨论吧,有错误还请lz明示,你不明白的那个循环是不是取消指向自己的啊?就是一个表项的跳转指针指向他自己。