#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
如果此代码通过词法分析器传递
,那么输出应该是什么答案 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_KEYWORK
,IF_KEYWORD
等等......
答案 1 :(得分:3)
预编译器指令不会出现在编译器的输入中,因为预处理器将使用它们。因此#include<stdio.h>
将替换为stdio.h
文件的内容。
结果文件将根据tokens
scanner
分解为lexical rules
,parser
可以找到here,并将传递给{{1}}当它要求令牌的时候。