这是我们的一次编程作业,要求用C编写一个简单的词法分析器。要求如下:
编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等七大类。并依次输出各个单词的内部编码及单词符号自身文本串(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。
注意:单词类型大小写不敏感(即不区分大小写)
1、词法规则
关键字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not
单词类别:1
标识符: 字母或“_”打头的由字母、数字串或“_”组成的任意长度的符号串。
单词类别:2
整数: 数字串。
单词类别:3
小数: 数字串·数字串
单词类别:4
字符串: 由一对“”括起来的任意长度的符号串。注意:可以多行。
单词类别:5
分隔符: {、}、(、)、;、空格
单词类别:6
运算符: :=、=、<、<=、>、>=、+、-、*、/
单词类别:7
2、设计词法分析函数getToken( ),完成以下功能:
1)getToken( )每调用一次就分析出一个单词;
2)返回单词类别、单词自身文本串、单词在源文件中的行列号;
3、编写测试程序,反复调用函数getToken ( ),输出单词信息。
以下是代码实现:
注意的事项:
1,">="这一类操作符要进行判断。
2,小数的识别。为了简便,我把小数当成字符串进行处理,后续可以加上一个字符串转数字的程序,或者直接直接识别成小数。
3,输入的源程序如何判断结束,我使用的是"#"字符进行判断,应该可以通过使用EOF进行识别吧。
4,超前搜索指针要回退。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define KW 1 //关键字 #define ID 2 //标识符 #define INT 3 //整数 #define FLT 4 //小数 #define STR 5 //字符串 #define BRK 6 //分隔符 #define OP 7 //操作符 #define WordLen 100 char prog[80],token[WordLen]; char ch; int p,j,syn; int rowNum,lineNum; char *keyword[18] = {"program","const","var","integer","decimal","string","procedure", "begin","end","if","then","else","while","do","call","read","write","not"}; void getToken(){ for(int i = 0;i < WordLen;i++) token[i] = NULL; ch = prog[p++]; /*识别标识符或者变量名*/ if(ch >= 'a'&&ch <= 'z'||ch == '_'){ int i = 0; while((ch >= '0'&&ch <= '9')||(ch >= 'a'&&ch <= 'z')||ch == '_'){ token[i++] = ch; ch = prog[p++]; } token [i++] = '