我编写了一个程序,用于分析pascal中的代码。我已经完成了文本的工作,现在我必须将我的结果保存在链表中,我有任何概念如何做到这一点。在我的计划中,我有以下要素:
variables(name, type)
constants(name)
typedef(name and components)
procedures(local variables, constants and types)
function (its var, const and types)
在我看来,创建5个列表将不是有效的解决方案。您能否给我一个提示如何使用不同数量的组件创建这些元素的列表? 非常感谢
答案 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个列表不一定效率低下。
另一种方法是制作一种将所有信息存储在一个列表中的通用方法。你可以列举你要存储的内容。