C++写的一个简单的词法分析器(分析C语言)
实验用:
几点注意:
1.代码又长又臭,时间关系,没有优化,冗余项多(我都看不下去了。)
2.加了一下简单的错误检测。(在mapping.h中定义了错误类型,可以查阅)
3.使用头文件宏定义来表示单词的各种属性,也可以用文件
4.对于标志符的入口地址,无非是为了唯一识别,只要名字相同,都作为一个,使用自增的Int来模拟入口地址,即唯一标识。不考虑变量类型。
5.最后输出有三个表:Token表,错误表,标志符表。
6.一个字符一个字符的读文件,其实可以每次读到一个固定长度的缓冲区,双缓冲区进行分析。也可以读每一行。
代码:
mapping.h:
请输入要进行语法分析的C语言程序:test.c************************************分析表****************************** 内容 描述 种别码 地址 行号 <stdio.h> 头文件 130 1 "my.h" 头文件 130 2 max 90 常量 55 3 int 关键字 17 6 char 关键字 4 6 main 标志符 40 1 6 ( 限界符 100 6 ) 限界符 101 6 { 限界符 104 7 8888 常量 51 8 char 关键字 4 8 yn 标志符 40 2 8 ; 限界符 110 8 do 关键字 8 9 { 限界符 104 10 int 关键字 17 11 9801 常量 51 11 ; 限界符 110 11 float 关键字 13 12 ; 限界符 110 12 double 关键字 9 13 f 标志符 40 3 13 ; 限界符 110 13 float 关键字 13 14 -9.876 常量 53 14 ; 限界符 110 14 double 关键字 9 15 hello 标志符 40 4 15 . 限界符 106 15 8.9 常量 53 15 ; 限界符 110 15 float 关键字 13 16 7.9e-5 常量 53 16 ; 限界符 110 16 int 关键字 17 17 e 标志符 40 5 17 -5 常量 51 17 ; 限界符 110 17 a 标志符 40 6 18 /= 运算符 87 18 6 常量 51 18 ; 限界符 110 18 init 标志符 40 7 19 ( 限界符 100 19 ) 限界符 101 19 ; 限界符 110 19 无 注释 120 19 scanner 标志符 40 8 20 ( 限界符 100 20 ) 限界符 101 20 ; 限界符 110 20 无 注释 121 21 printf 标志符 40 9 21 ( 限界符 100 21 " 限界符 112 21 Are You continue(y/n)\n 常量 54 21 " 限界符 112 21 ) 限界符 101 21 ; 限界符 110 21 yn 标志符 40 2 22 = 运算符 72 22 getch 标志符 40 10 22 ( 限界符 100 22 ) 限界符 101 22 ; 限界符 110 22 if 关键字 16 23 ( 限界符 100 23 a 标志符 40 6 23 == 运算符 80 23 7 常量 51 23 ) 限界符 101 23 { 限界符 104 24 } 限界符 105 26 else 关键字 10 27 { 限界符 104 28 } 限界符 105 30 } 限界符 105 33 while 关键字 32 34 ( 限界符 100 34 yn 标志符 40 2 34 == 运算符 80 34 ' 限界符 111 34 y 常量 52 34 ' 限界符 111 34 || 运算符 83 34 yn 标志符 40 2 34 == 运算符 80 34 ' 限界符 111 34 Y 常量 52 34 ' 限界符 111 34 ) 限界符 101 34 ; 限界符 110 34 return 关键字 20 36 0 常量 51 36 ; 限界符 110 36 [ 限界符 102 37 hello 标志符 40 4 37 无 注释 121 43 无 注释 121 45 无 注释 121 46 printf 标志符 40 9 47 ( 限界符 100 47 " 限界符 112 47 hello 常量 54 47 " 限界符 112 47 ) 限界符 101 47 ; 限界符 110 47************************************错误表****************************** 内容 描述 类型 行号 #de some 预处理错误 13 4 9. float表示错误 1 12 9.e double表示错误 2 13 @ 非法字符 6 31 无 注释没有结束符 3 49 无 '['没有对应项 9 37 无 '{'没有对应项 11 7************************************标志符表****************************** 内容 描述 种别码 地址 行号 main 标志符 40 1 6 yn 标志符 40 2 8 f 标志符 40 3 13 hello 标志符 40 4 15 e 标志符 40 5 17 a 标志符 40 6 18 init 标志符 40 7 19 scanner 标志符 40 8 20 printf 标志符 40 9 21 yn 标志符 40 2 22 getch 标志符 40 10 22 a 标志符 40 6 23 yn 标志符 40 2 34 yn 标志符 40 2 34 hello 标志符 40 4 37 printf 标志符 40 9 47Process returned 0 (0x0) execution time : 5.629 sPress any key to continue.