编译原理 一个小作业
之前写的一个小作业
题目:词法分析实验
C++做的

实验代码:
bianyi1.cpp:
#include <iostream> #include <cctype> #include <fstream> #include <string> #include "bianyi.h" using namespace std; int main() { char first; //每次读入的第一个字符 string word = ""; //组成的单词 int num = 0; //每识别出一个单词,用num对应符号表下表存入符号表 int row = 0; //txt文件中行数 ifstream in("text.txt"); string line; //从文件中读入的每行字符串 while (getline(in, line)) { row++; int s = line.size(); //确定该行的字符数目 int i = 0; //用于计数 while (i < s) { first = line[i]; //当读到的第一个字符为空格时 while (isspace(first)) { i++; first = line[i]; } //读取到的第一个字符为字母时 while (judge_Word(first)) { word += first; i++; first = line[i]; while (judge_Word(first) || judge_Number(first)) { word += first; i++; first = line[i]; } if (judge_ReserveWord(word)) { T[num].category = 1; T[num].symbol1 = word; num++; word = ""; } else { T[num].category = 2; T[num].symbol1 = word; num++; word = ""; } } //读取到的第一个字符为运算符时 while (judge_Operator(first)) { T[num].category = 4; T[num].symbol1 = first; num++; i++; first = line[i]; } //读取的第一个字符为数字时 while (judge_Number(first)) { word += first; i++; first = line[i]; if (isspace(first) || judge_Operator(first) || judge_Delimmiter(first)) { T[num].category = 3; T[num].symbol1 = word; num++; word = ""; } else if (judge_Word(first)) { cout << "erro:" << row << " line definition!" << endl; break; } } //读取到的第一个字符为分隔符时 while (judge_Delimmiter(first)) { T[num].category = 5; T[num].symbol1 = first; num++; i++; first = line[i]; } } } ofstream out("text1.txt"); for (int m = 0; m < 100; m++) { if (T[m].category != 0) { cout << "(" << T[m].category << ",'" << T[m].symbol1 << "')" << endl; out << " (" << T[m].category << ",'" << T[m].symbol1 << "')" << endl; } } return 0; }
bianyi.h:
#include <string> #include <cctype> using namespace std; struct symbolTable { int category; //单词种别,未确定时置为0 string symbol1; //符号自身的值 }; //译码表 struct reservedWord { int category = 1; //单词种别 string symbol2; //符号自身的值 }; //保留字 struct Delimmiter { int category = 4; //单词种别 string symbol3; //符号自身的值 }; //分隔符 struct Operator { int category = 4; //单词种别 string symbol4; //符号自身的值 }; //运算符 struct Identifier { int category = 2; //单词种别 string symbol5; //符号自身的值 }; //标识符 symbolTable T[100]; //定义符号表 //判断该字符是否是字母 bool judge_Word(char x) { if (isalpha(x)) { return true; } else return false; } //判断该字符是否是数字 bool judge_Number(char x) { if (isdigit(x)) { return true; } else return false; } //判断该字符是否是界符 bool judge_Delimmiter(char x) { if (x == ',' || x == ';' || x == '(' || x == ')' || x == '{' || x == '}') { return true; } else return false; } //判断是否是运算符 bool judge_Operator(char x) { if (x == '+' || x == '-' || x == '*' || x == '=' || x == '/') { return true; } else return false; } //判断是否是保留字 bool judge_ReserveWord(string x) { if (x == "if" || x == "int" || x == "for" || x == "while" || x == "do" || x == "return" || x == "break" || x == "continue") { return true; } else return false; }
同时在源代码目录下创建两个txt文件,一个放输入内容,一个放输出内容:
输入文件:
输出文件:


浙公网安备 33010602011771号