我是
靠谱客的博主
优美烤鸡,这篇文章主要介绍
词法分析器的原理解释及代码实现,现在分享给大家,希望可以做个参考。
- 打开源文件,读取文件内容,直至遇上‘$’文件结束符,然后读取结束。
- 对读取的文件进行预处理,从头到尾进行扫描,去除 // 和 /* */ 的内容,以及一些无用的、影响程序执行的符号如换行符、回车符、制表符等。但是千万不要在此时去除空格,因为空格在词法分析中有用
- 接下来对源文件从头到尾进行扫描。从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格则继续扫描下一个字符,直到扫描出的字符不是空格,然后询问这个字符是不是字母,若是则进行标识符和保留字的识别;若这个字符是数字,则进行数字的判断。否则,依次对这个字符可能的情况进行判断,若是将所有可能都走了一遍还是没有知道它是谁,则认定为错误符号,输出该错误符号,然后结束。每次成功识别了一个单词后,单词都会存在token[ ]中。然后确定这个单词的种别码,最后进行下一个单词的识别。 这就是扫描程序进行的工作。
- 主控程序主要负责对每次识别的种别码syn进行判断,对于不同的单词种别做出不同的反应。如对于识别符则将其插入标识符表中;对于保留字则输出该保留字的种别码和助记符,等。直至遇到syn=0,程序结束。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "iostream"
using namespace std;
/****************************************************************************************/
static char reserveWord[32][20] = {
"auto", "break", "case", "char", "const", "continue",
"default", "do", "double", "else", "enum", "extern",
"float", "for", "goto", "if", "int", "long",
"register", "return", "short", "signed", "sizeof", "static",
"struct", "switch", "typedef", "union", "unsigned", "void",
"volatile", "while"
};
static char operatorOrDelimiter[36][10] = {
"+", "-", "*", "/", "<", "<=", ">", ">=", "=", "==",
"!=", ";", "(", ")", "^", ",", """, "'", "#", "&",
"&&", "|", "||", "%", "~", "<<", ">>", "[", "]", "{",
"}", "\", ".", "?", ":", "!"
};
static char IDentifierTbl[1000][50] = { "" };
/****************************************************************************************/
/********查找保留字*****************/
int searchReserve(char reserveWord[][20], char s[])
{
for (int i = 0; i < 32; i++)
{
if (strcmp(reserveWord[i], s) == 0)
{
return i + 1;
}
}
return -1;
}
/********查找保留字*****************/
/*********************判断是否为字母********************/
bool IsLetter(char letter)
{
if (letter >= 'a'&&letter <= 'z' || letter >= 'A'&&letter <= 'Z'|| letter=='_')
{
return true;
}
else
{
return false;
}
}
/*********************判断是否为字母********************/
/*****************判断是否为数字************************/
bool IsDigit(char digit)
{
if (digit >= '0'&&digit <= '9')
{
return true;
}
else
{
return false;
}
}
/*****************判断是否为数字************************/
/********************编译预处理,取出无用的字符和注释**********************/
void filterResource(char r[], int pProject)
{
char tempString[10000];
int count = 0;
for (int i = 0; i <= pProject; i++)
{
if (r[i] == '/'&&r[i + 1] == '/')
{
while (r[i] != 'n')
{
i++;
}
}
if (r[i] == '/'&&r[i + 1] == '*')
{
i += 2;
while (r[i] != '*' || r[i + 1] != '/')
{
i++;
if (r[i] == '$')
{
printf("注释出错,没有找到 */,程序结束!!!n");
exit(0);
}
}
i += 2;
}
if (r[i] != 'n'&&r[i] != 't'&&r[i] != 'v'&&r[i] != 'r')
{
tempString[count++] = r[i];
}
}
tempString[count] = '