2010-04-18 57 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