#include<stdio.h>
int main()
{
int a,b;
a=a+b;
printf("%d",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果此代码通过词法分析器传递,应该是什么输出
Jac*_*ack 12
词法分析器只是将流标记化以将字符流转换为标记流(稍后将使用解析器解析以获得完整的语法树).对于您的示例,您将获得以下内容:
#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
Run Code Online (Sandbox Code Playgroud)
当然词法分析器本身不能做太多,它可以将源分成可能的最小元素,检查语法错误(如拼写错误的关键字).你将需要一些能够将它们结合起来以赋予它们语义含义的东西.
只是旁注:一些词法分析者喜欢KEYWORD使用与之关联的参数将一组相似类型的标记(例如包含所有关键字的标记)分组,而其他标记则为每个标记分别使用不同的标记RETURN_KEYWORK,IF_KEYWORD依此类推.