【问题标题】:Linked lists, program in C链表,C语言程序
【发布时间】:2014-02-11 01:49:09
【问题描述】:

我编写了一个程序,它将分析帕斯卡中的代码。我已经完成了对文本的处理,现在我必须将结果保存在链接列表中,并且我知道如何去做。在我的程序中,我有以下元素:

variables(name, type)
constants(name)
typedef(name and components)
procedures(local variables, constants and types)
function (its var, const and types)

在我看来,创建 5 个列表并不是有效的解决方案。你能给我一个提示如何为这些具有不同数量组件的元素创建列表吗? 非常感谢

【问题讨论】:

    标签: c linked-list analysis lexical-analysis


    【解决方案1】:

    这取决于您所说的“高效”。

    如果你想把所有不同的元素都放在同一个列表中,你需要给元素添加类型信息,当然还要花时间过滤掉所有错误的元素。

    那么,不同类型元素的单独集合似乎更有效。

    你应该这样做:

    typedef struct Element Element;
    
    struct Element {
      Element     *next;
    };
    
    typedef struct {
      char *name;
      VariableType type;
    } ElementVariable;
    
    /* ... and so on */
    

    那么你就可以有各种链表头了:

    ElementVariable *variables;
    ElementConstant *constants;
    

    由于每个ElementXXX 类型都以Element 开头,因此您可以编写相当通用的链表代码来处理所有不同的类型。

    【讨论】:

      【解决方案2】:

      我不确切知道您想对列表做什么,但这里有一个想法:创建一个树,其中 siblings 的行为类似于喜欢列表中的常规 next 项目,而 children 提供附加信息,例如复合类型或函数参数的条目。

      所以结构看起来像这样:

      struct Entity {
          const char *id;
          enum Type type;
          char is_const;
          char is_var;
          /* ... whatever ... */
          struct Entity *next;
          struct Entity *child;
      };
      

      如果你有

      var x: integer;
      procedure proc(var res: integer, x, y: integer); forward;
      type date = record
          dd, mm, yy: integer;;
      end;
      

      你的树应该是这样的:

      [var x: integer]
        |
      [proc: procedure]     ->  [var res: integer]
        |                         |
        |                       [x: integer]
        |                         |
        |                       [y: integer]
        |
      [type date: record]   ->  [dd: integer]
                                  |
                                [mm: integer]
                                  |
                                [yy: integer]
      

      这里,箭头-> 表示子项,竖线| 表示兄弟姐妹或只是列表中的下一项。

      左侧的元素构成您的主要列表,其中包括您的第一级(全局范围)符号。下一级表示父元素的范围。例如dd 仅在记录date 中已知。这本质上是一个多级链表,可以轻松扩展任意数量的函数参数或记录条目。

      【讨论】:

        【解决方案3】:

        5 个列表不一定是低效的,除非您想在所有列表中搜索名称或其他内容。

        另一种方法是采用通用方式将所有信息存储在一个列表中。您可以枚举您存储的内容。

        【讨论】:

          猜你喜欢
          • 2021-11-07
          • 1970-01-01
          • 2014-05-07
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          相关资源
          最近更新 更多