flw2 发表于 2010-03-20 17:02

一个base check next 的问题

参考
http://www.opensubscriber.com/message/help-bison@gnu.org/11185501.html
http://www.opensubscriber.com/message/help-bison@gnu.org/13617870.html

我确认下面这两行删除会有问题, 但是不知道原因,哪位看过这段代码么?
看byacc, 就差这几行


static base_number
pack_vector (vector_number vector)
{
vector_number i = order;
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; ; j++)
    {
      int k;
      bool ok = true;

      aver (j < table_size);

      for (k = 0; ok && k < t; k++)
    {
      loc = j + state_number_as_int (from);
      if (table_size <= loc)
      table_grow (loc);

      if (table != 0)
      ok = false;
    }

      for (k = 0; ok && k < vector; k++)
    if (pos == 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;
          table = to;
          if (nondeterministic_parser && conflict_to != NULL)
      conflict_table = conflict_to;
          check = from;
      }

      while (table != 0)
      lowzero++;

      if (loc > high)
      high = loc;

      aver (BASE_MINIMUM <= j && j <= BASE_MAXIMUM);
      return j;
    }
    }
}

prolj 发表于 2010-03-20 17:47

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

flw2 发表于 2010-03-20 18:02

汗,别让我自卑了

for (k = 0; ok && k < vector; k++)
    if (pos == 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+token_value] == s不就行了吗,干嘛还要求base不等

flw2 发表于 2010-04-13 20:43

今天突然想起来了

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

如果两个base相同,那么可能会误用别人的next
页: [1]
查看完整版本: 一个base check next 的问题