#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
应该是什么样的输出,如果这个代码是通过词法词法分析器的输出应该在c中?
#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
应该是什么样的输出,如果这个代码是通过词法词法分析器的输出应该在c中?
词法分析器只是标记流以将字符流转换为标记流(稍后将使用解析器解析以获取完整的语法树)。为了您的例子中,你将获得类似:
#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
等等。
预处理指令将不存在输入到编译器的预处理程序会消耗他们过去了。因此#include<stdio.h>
将被替换为stdio.h
文件的内容。
所得文件会被scanner
根据其可以发现here和将被传递到如parser
,当它要求令牌lexical rules
被分解成tokens
。
不管它是最方便的解析器使用。 – 2010-04-18 12:43:08