设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
针对表达各类词语的一组正规表达式,设计一个确定化的最简的有限自动机,对输入的符号串进行单词划分及词类识别。
要求词法分析器的输入是字符串,输出是源程序中各单词的字符串、词的类别以及对应值。
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
(二)概要设计
1.单词符号及内部表示表
单词符号 | 种别码 | 值 |
Int | 1 | 关键字 |
break | 2 | 关键字 |
if | 3 | 关键字 |
long | 4 | 关键字 |
while | 5 | 关键字 |
union | 6 | 关键字 |
return | 7 | 关键字 |
double | 8 | 关键字 |
else | 9 | 关键字 |
X1+ | 10 | 标识符 |
25.2 | 11 | 数字 |
+-*、>< | 13~28 | 符号 |
// 跳过空白符,直至读入一个非空字符
char GetBC(int *p)
{
while(chStream[*p] == ' '){
(*p)++;
}
return chStream[(*p)++];
}
// 判断是否为字母
int IsLetter(char c)
{
if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'))||ch=='~'){
return 1;
}
return 0;
}
// 判断是否为数字
int IsDigit(char c)
{
if((c>='0'&&c<='9')|c=='.'){
return 1;
}
return 0;
}
// 搜索指针回调一个字符位置
void Retract(int *p)
{
(*p)--;
}
// 运算符和界符的判断
void solve(int *p)
{
memset(strToken, 0, sizeof(strToken));
ch = GetBC(p); // 跳过空白符,直至读入一个非空字符
if(IsLetter(ch)){ // 第一个是字母,则可能是关键字也可能是标识符
int idx = 0;
while(IsLetter(ch) || IsDigit(ch)){
strToken[idx++] = ch;
ch = GetChar(p);
}
输入:输入源码字符串,然后以@结尾就好。
输出:会在屏幕上输出分析后的结果序列。
- 收获、不足与感想
成功实现了基本的词法分析器,能够识别关键字、标识符、数字和符号。使用了数组和指针等基本数据结构和操作。可能需要更多的注释和说明,以提高代码的可读性和可维护性。对于错误处理和异常情况的处理较为简单,可以进一步完善。通过编写词法分析器,加深了对字符处理、数组操作和程序流程控制的理解。学到了如何处理关键字、标识符和数字等基本语法结构。这是一个简单但有效的词法分析器,还可以进一步扩展和改进。