2014-01-21 124 views
0

我寫了一個程序,它將分析pascal中的代碼。我已經完成了文本工作,現在我必須將結果保存在鏈表中,並且我有任何有關如何去做的概念。在我的程序中,我有以下元素:鏈接列表,在C編程

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

在我看來,創建5個列表不會是有效的解決方案。你可以給我一個提示如何創建這些元素與不同數量的組件的列表?除非你想搜索他們都爲一個名字,什麼 非常感謝

回答

0

5列出不一定是低效率的。

另一種方法是製作將所有信息存儲在一個列表中的通用方法。你可以列舉你正在存儲的內容。

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

我並不確切地知道你想要什麼用列表做的,但這裏有一個想法:創建一棵樹在那裏兄弟姐妹行爲像喜歡列表中的定期next項目,其中兒童提供類似的附加信息複合類型或函數參數的條目。

所以結構會是這個樣子:

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] 

這裏,箭頭->表示兒童和豎槓|兄弟姐妹或只是下一個項目在t他列出。

在左側的元件形成主列表中,包括第一個級別(全局範圍)符號。下一級意味着父元素的範圍。例如dd只在記錄date內部是已知的。這基本上是一個多級鏈接列表,可以輕鬆擴展任意數量的函數參數或記錄條目。