链接列表,C中的程序

时间:2014-01-21 12:47:54

标签: c linked-list analysis lexical-analysis

我编写了一个程序,用于分析pascal中的代码。我已经完成了文本的工作,现在我必须将我的结果保存在链表中,我有任何概念如何做到这一点。在我的计划中,我有以下要素:

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

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

3 个答案:

答案 0 :(得分: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开头,因此您可以编写相当通用的链接列表代码来处理所有不同类型。

答案 1 :(得分:1)

我不知道你想要对列表做什么,但是这里有一个想法:创建一个树,其中兄弟就像喜欢列表中的常规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中已知。这本质上是一个多级链表,很容易扩展为任意数量的函数参数或记录条目。

答案 2 :(得分:0)

除非您想要全部搜索名称或其他内容,否则5个列表不一定效率低下。

另一种方法是制作一种将所有信息存储在一个列表中的通用方法。你可以列举你要存储的内容。