一个base check next 的问题

发布于 2022-09-15 11:16:24 字数 2859 浏览 10 评论 3

参考
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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝眸 2022-09-19 13:52:59

今天突然想起来了

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

如果两个base相同,那么可能会误用别人的next

东走西顾 2022-09-18 16:48:16

汗,别让我自卑了

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

狼亦尘 2022-09-17 18:47:18

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文