词法分析器的输出应该在c中?

时间:2010-04-18 12:35:35

标签: c lex

#include<stdio.h>

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

如果此代码通过词法分析器传递

,那么输出应该是什么

2 个答案:

答案 0 :(得分:12)

lexer只是将流标记化以将字符流转换为标记流(稍后将使用解析器解析以获得完整的语法树)。对于你的例子,你会得到类似的东西:

#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等等......

答案 1 :(得分:3)

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

结果文件将根据tokens scanner分解为lexical rulesparser可以找到here,并将传递给{{1}}当它要求令牌的时候。