LEMON原始碼分析筆記 分割原始碼

2021-05-24 15:08:15 字數 3344 閱讀 1857

lemon

原始碼分析筆記——分割原始碼

五千多行**集於乙個檔案,這不是什麼明智之舉。根據原始碼中的提示,可以程式設計乙個分割程式。

分割程式的工作是,識別出檔名,並把用它建立檔案,寫入相應內容。在處理過程式,記錄標頭檔案。在識別出原始檔時,把在其前的標頭檔案

#include

進去。理論上這樣做是可行的。因為原始檔所需的定義或宣告一定在其前的標頭檔案中包含了。而原始檔之間沒有什麼瓜葛。但

lemon

源**並不是想象中的那麼規範。有許多地方要改。

l呼叫了其它檔案的靜態函式。

msort.c

實現的內部函式

msort

被action.c

中呼叫;

action.c

實現的內部函式

action_sort

在report.c

中呼叫。

l呼叫其它原始檔的靜態變數。

main.c

中定義的內部變數

int ndefine,char** szdefine

在parse.c

中引用。

l原始檔中定義巨集與結構體。

action.c

中定義了的巨集

acttab_size,acttab_yyaction,acttab_lookahead

會在report.c

中引用。

action.c

中還定義了

acttab

結構體,而此結構在

report.c

中需要引用。

為消除警告而採取的修改

警告

修改

buildshift

中呼叫了沒有宣告的

action_add

action.h

中新增acion_add

宣告

configlist

中呼叫的

msort

的第三個引數與

configcmp

不匹配

強制型別轉換(int (*)(const

char*,const

char*))

main

中呼叫的

qsort

的第四個引數與

symbolcmp

型別不匹配

強制型別轉換(int (__cdecl *)(const

void *,const

void *))

vsdeprecate

警告

global.h

中新增#pragma warning

(disable 4996

reporttable

的呼叫的

acttab_action,acttab_alloc,acttab_insert

沒有事先宣告

acttab.h

中新增宣告

中n

+sizeof(zint)*2+used >= alloced

警告「signed/unsigned mismatch

n+(int)sizeof(zint)*2+used >= alloced

警告next

巨集型別轉換:「

'type cast' : pointer truncation from 'char *' to 'unsigned long'

工程屬性

->c/c++->

常規->

【檢測64

位可移植性問題】選否

小結:

1.

兩源程式中出現同名結構體,以本檔案的結構體定義為準。

extern

過來的變數,其值直接覆蓋在本檔案結構體上。

/*file1.c*/

struct

node;

struct

node

n = ;

/*file2.c*/

struct

node;

/*在file2.c中,n只量使用data域,其值被,0由低到高填充,故為*/

2.

只要函式在宣告或定義的開頭加上了

static

那麼,它就是乙個靜態函式。只能夠在本檔案內被訪問。

3.

c

語言允許函式在沒有宣告之前就發生呼叫。包括庫函式

void

main()

但assert

函式不行,因為這是乙個巨集

#define

assert(_expression) (void)( (!!(_expression)) || (_wassert(_crt_wide(#_expression), _crt_wide(__file__), __line__), 0) )

4.

標頭檔案中通常會包含內部函式與全域性函式的宣告。內部函式不向外提供呼叫,那麼為什麼要包括在標頭檔案中呢?原因是,為其所在原始檔內部對其的呼叫,提供事先宣告。標頭檔案的內部函式宣告,不是為別的原始檔而聲的,而是為該內部函式所在的原始檔聲的。當然其中的全域性函式也是出於這個原因,但全域性函式還得為別原始檔提供事先宣告。

問題是如果將這樣的標頭檔案包含在未定義其中內部函式的原始檔中,結果會是怎樣的呢?分四種情況: 呼叫

定義內部函式

declared but not defined ok

全域性函式

ok找到乙個或多個多重定義的符號

5.

標頭檔案不參加編譯。如果標頭檔案未被

include

進原始檔中,編譯器不會檢查其語法的。

LEMON原始碼分析 專案FOLLOW集求法

lemon 原始碼分析 專案 follow 集求法 都知道follow 集是針對非終結符的,而 lemon 中的專案follow 集是針對專案的,指的是專案產生式左部非終結符follow 集。知道了專案 follow 集,它的求法也自然清楚了。這裡把專案分成兩類,它們的 follow a.號點不在最...

Soul原始碼分析 soul admin原始碼分析

頁面操作原始碼分析 public int createorupdate final selectordto selectordto else publishevent selectordo,selectorconditiondtos return selectorcount 與soul bootst...

ReentrantLock原始碼分析 筆記

reentrantlock的實現原理分析 重入鎖提供了兩種實現,怎麼理解公平和非公平呢?反之,就是不公平的。簡單來說公平鎖就是等待時間最長的執行緒最優先獲取鎖。非公平鎖的實現流程時序圖 原始碼分析 並且sync有兩個實現,我們先來分析一下非公平鎖的實現 final void lock 所以在這裡,是...