词法分析程序的设计(编译原理实验一)
一、实验内容
编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
二、实验要求
-
编写程序,识别如下单词符号
标识符 <字母>(<字母>|<数字字符>)*
十进制整数 0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)
八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和界符 + - * / > < = ( ) ;
关键字 if then else while do
-
以二元组形式输出单词<单词种类,单词属性>
其中单词种类用整数表示:
0:标识符
1:十进制整数
2:八进制整数
3:十六进制整数
运算符和界符,关键字采用一字一符,不编码
其中单词属性表示如下:
标识符,整数由于采用一类一符,属性用单词表示
运算符和界符,关键字采用一字一符,属性为空
三、测试数据
输入数据:
编辑一个文本文件program.txt,在文件中输入如下内容:
正确结果:
四、实验代码
//头文件
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
//全局变量
string instr;//输入符号串 存放整个程序的字符串
int index;//当前输入符号读入字符的位置,字符指针,逐个读取instr,识别出一个一个单词
char character;//全局变量字符,存放index读取的字符
string token;//字符数组,存放已读入的字符序列,也即目前读取的单词
const int len = 10;
string Reserve[len];//保留字表
//要输出的二元组形式:<单词种类,单词属性>
struct Binary {
Binary(string t, string v) {
type = t;
value = v;
}
string type;
string value;
};
//构造关键字表的函数
void init_Reserve() {
Reserve[0] = "if";
Reserve[1] = "then";
Reserve[2] = "else";
Reserve[3] = "while";
Reserve[4] = "do";
}
//读入一个字符
void getChar() {
character = instr[index++];
}
//读入非空白字符
void getnbc() {
while (character == ' ') {
getChar();
}
}
//连接字符串
void concat() {
token = token + character;
}
//判断是否为字母
bool letter() {
if ((character >= 'A' && character <= 'Z') || (character >= 'a' && character <= 'z'))
return true;
return false;
}
//判断是否为数字
bool digit() {
if (character >= '0' && character <= '9')
return true;
return false;
}
//回退读取字符串的指针
void retract() {
character = ' ';
index--;
}
//判断标识符
bool isIdentifier() {
for (int i = 1; i < token.size(); i++) {
if (!((token[i] >= '0' && token[i] <= '9') || (token[i