2010-04-18 36 views
5
#include<stdio.h> 

int main() 
{ 
    int a,b; 
    a=a+b; 
    printf("%d",a); 
return 0; 
} 

應該是什麼樣的輸出,如果這個代碼是通過詞法詞法分析器的輸出應該在c中?

+7

不管它是最方便的解析器使用。 – 2010-04-18 12:43:08

回答

11

詞法分析器只是標記流以將字符流轉換爲標記流(稍後將使用解析器解析以獲取完整的語法樹)。爲了您的例子中,你將獲得類似:

#include <stdio.h> (this is handled by preprocessor, not by lexer so it wouldn't exist) 

int KEYWORD 
main IDENTIFIER 
(LPAR 
) RPAR 
{ LBRACE 
int KEYWORD 
a IDENT 
, COMMA 
b IDENT 
; SEMICOL 
a IDENT 
= ASSIGN 
a IDENT 
+ PLUS 
b IDENT 
; SEMICOL 
printf IDENT 
(LPAR 
"%d" STRING 
, COMMA 
a IDENT 
) RPAR 
; SEMICOL 
return RETURN_KEYWORD 
0 INTEGER 
; SEMICOL 
} RBRACE 

當然詞法分析本身不能做太多,它只能分割成源可能最小的元素,檢查語法錯誤(比如拼錯的關鍵字)。你需要一些能夠將它們結合起來賦予它們語義的東西。

只是一個側面說明:一些詞法分析器喜歡將類似的各種令牌,在短短一個用與它相關的參數,而另一些則對每一個像RETURN_KEYWORK不同的令牌(例如包含所有關鍵字KEYWORD令牌) ,IF_KEYWORD等等。

+0

預處理器不會取出整個#include ,並且基本上內嵌任何文件的內容? – JustJeff 2010-04-18 12:52:48

+0

我不確定C編譯器,如果他們真的內聯它並重新使用它,或者只是使用includes來知道應該定義什麼(而不實際重新整理標題),特別是對於標準定義的(在__ < > __中) – Jack 2010-04-18 12:55:26

+0

在答案中有一個錯字,它應該是'RETURN_KEYWORD',但我無法編輯答案,因爲我至少需要更改6個字符。 – ollydbg23 2017-02-03 13:35:37

3

預處理指令將不存在輸入到編譯器的預處理程序會消耗他們過去了。因此#include<stdio.h>將被替換爲stdio.h文件的內容。

所得文件會被scanner根據其可以發現here和將被傳遞到如parser,當它要求令牌lexical rules被分解成tokens