设计内容
手工设计C语言的词法分析器(也可以是C语言的子集)。处理C语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组的形式存放在文件中。
分析
如果我们要做一个词法分析器,那么我们要先构造出一个状态图来表示单词规则,而在构造状态图之前要先了解该语言的单词种类。由于C语言中的单词种类较多,这里我们简化一下,只考虑一些比较简单的单词种类,而没有考虑一些比较复杂的内容,比如逻辑运算、数组的处理、注释的处理等等。单词种类如下表所示:
分析完单词规则后我们可以构造出状态图:
实现
有了状态图,我们就可以按照状态图中的顺序来处理C语言的源程序,根据每个条件选项来判断每个单词的种类以及是否合法,因此程序实现也会很简单。
样例输入(输入来自文件in.txt):
int main() {
int a , b , c_;
int 100abc;
char s = 'a';
string st = "132";
a = 100 , b = 200 , c = 300;
for(int i = 1 ; i <= 20 ; i = i+1) {
a = a + b;
}
return 0;
}
@@
样例输出(输出至文件out.txt):
标识符或关键字 int
标识符或关键字 main
左括号 (
右括号 )
左大括号 {
标识符或关键字 int
标识符或关键字 a
逗号 ,
标识符或关键字 b
逗号 ,
标识符或关键字 c_
分号 ;
标识符或关键字 int
非法单词 100abc
分号 ;
标识符或关键字 char
标识符或关键字 s
赋值 =
字符 'a'
分号 ;
标识符或关键字 string
标识符或关键字 st
赋值 =
字符串 "132"
分号 ;
标识符或关键字 a
赋值 =
数字 100
逗号 ,
标识符或关键字 b
赋值 =
数字 200
逗号 ,
标识符或关键字 c
赋值 =
数字 300
分号 ;
标识符或关键字 for
左括号 (
标识符或关键字 int
标识符或关键字 i
赋值 =
数字 1
分号 ;
标识符或关键字 i
小于等于 <=
数字 20
分号 ;
标识符或关键字 i
赋值 =
标识符或关键字 i
加 +
数字 1
右括号 )
左大括号 {
标识符或关键字 a
赋值 =
标识符或关键字 a
加 +
标识符或关键字 b
分号 ;
右大括号 }
标识符或关键字 return
数字 0
分号 ;
右大括号 }
非法单词 @
非法单词 @
结语
这是我上学期编译原理的课程设计之一,为防伸手党这里就不附代码。其实代码很容易构造的,利用状态图判断就可以了。