6
#include<stdio.h>

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

如果这段代码通过词法分析器应该是什么输出

4

2 回答 2

14

词法分析器只是对流进行标记以将字符流转换为标记流(稍后将使用解析器对其进行解析以获得完整的语法树)。对于您的示例,您将获得以下内容:

#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

当然,词法分析器本身不能做很多事情,它可以将源代码拆分为可能的最小元素,检查语法错误(如拼写错误的关键字)。您将需要将它们组合在一起以赋予它们语义含义的东西。

顺便说一句:一些词法分析器喜欢使用与之关联的参数将相似类型的标记分组为一个(例如KEYWORD,包含所有关键字的标记),而另一些词法分析器对每个类似的标记都有不同的标记RETURN_KEYWORKIF_KEYWORD依此类推。

于 2010-04-18T12:43:30.550 回答
4

预处理器指令不会出现在编译器的输入中,因为预处理器会使用它们。所以#include<stdio.h>将替换为stdio.h文件的内容。

生成的文件将根据可以在此处tokens找到的进行分解,并在它要求令牌时传递给as 。scannerlexical rulesparser

于 2010-04-18T12:43:15.340 回答