免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2880 | 回复: 3

一个base check next 的问题 [复制链接]

论坛徽章:
0
发表于 2010-03-20 17:02 |显示全部楼层
参考
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;
    }
    }
}

论坛徽章:
0
发表于 2010-03-20 17:47 |显示全部楼层
哇!lz在看bison/byacc!我没看过,提供一点思路吧,不一定帮的上你。
既然这个代码是bison和byacc的不同,那么bison和byacc在使用相关功能的时候有什么不同么?
yacc是生成shift reduce的跳转表,这个代码在tables.c里面,肯定是跳转表的信息了。我第一次看,还没明白这段代码的意思,一起讨论吧,有错误还请lz明示,你不明白的那个循环是不是取消指向自己的啊?就是一个表项的跳转指针指向他自己。

论坛徽章:
0
发表于 2010-03-20 18:02 |显示全部楼层
汗,别让我自卑了

  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不等

论坛徽章:
0
发表于 2010-04-13 20:43 |显示全部楼层
今天突然想起来了

这个check是由3个表合并在一起,yysindex yygindex, yyrindex都指向它

如果两个base相同,那么可能会误用别人的next
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP