2.1主程序设计考虑:
- 主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。
- id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。
- 主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。
2.2词法分析过程考虑
- 该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组
id 中,将常数存入数组中 ci 中,并记录其在表中的位置。
注: 所有识别出的单词都用二元组表示。第一个表示单词的种别编码。例如:关键字的 t=1;标识符的 t=2;常数 t=3;运算符 t=4;界符 t=5。第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其 i 值是根据它们在源程序中出现的顺序确定的)。
关键字和特殊符号如下(表中数字只是标记,不代表种别编码,种别编码自己定义):
结果:
设计思想
Note :在进行下列各操作之前要进行预先处理(删去各个换行符等各种干扰符号)。
两个思路:
- 判断字符串在不在预先设定的表中,在表中就输出。
- 判断字符串在不在随着识别的进行构建的表中,若在表中则输出,不在表中就存进去再输出。
代码实现了从文件导入数据,例:
源码:
#include <iostream>
#include "编译原理实验1.h"
#pragma warning(disable:4996)
using namespace std;
static char KeyWord[14][20] = {
"int","char","float","void","const","if","else","do","while","scanf","printf","return","main","read"
};
static char operation[1000][50] = {
"" };
static char Delimiter[8][10] = {
"(", ")" ,"{" ,"}" ,";" ,"," , "\"" ,"\'"
};
static char id[1000][50] = {
"" };
static char ci[1000][50] = {
"" };
int SearchKeyAndDefine(char KeyWord[][20], char s[])
{
for (int i = 0; i < 14; i++)
{
if (strcmp(KeyWord[i], s) == 0)
{
cout << s << "\t" << "(" << 1 << "," << i + 1 << ")" << endl;
return 0;
}
}
return 1;
}
bool Letter(char letter)
{
if (letter >= 'a' && letter <= 'z' || letter >= 'A' && letter