资源简介

扫描器和中间代码生成器的实现,大作业是论文 ps:软工lhj的编译方法,认真做都90+,最后总评97,想拿高分第二个实验要找她答辩

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
//关键词表
vector keywords = {
 “program“ “begin“ “end“ “var“ “while“ “do“
 “repeat“  “until“ “for“ “to“  “if“    “then“
 “else“    “;“     “:“   “(“   “)“     ““
 “:=“      “+“     “-“   “*“   “/“     “>“
 “>=“      “==“    “<“   “<=“
};

//代表转换图中边的值的种类
enum Type
{
other //其他字符
digit //数字“0123456789“
point //小数点“.“
exponent //指数符号“E“或“e“
letter //字母“abcdefghijklmnopqrstuvwxyz“
delimeter //界符“;:()+-*/=><“
p_or_n //正负号
};
const string delimeter_str = “;:()+-*/=><“;
//当前字符的类型
Type type;

//hash函数
struct pair_hash_func
{
template
std::size_t operator() (const std::pair &p) const
{
auto h1 = std::hash{}(p.first);
auto h2 = std::hash{}(p.second);
return h1 ^ h2;
}
};
//状态变换表表示sigma(intType) = int任何非法的变换都会到达状态0
unordered_map int pair_hash_func> aut =
{
{{1digit}2} {{1letter}8} {{1delimeter}9} {{1other}15}
{{2digit}2} {{2point}3} {{2exponent}5} {{2p_or_n}11} {{2other}11}
{{3digit}4}
{{4digit}4} {{4exponent}5} {{4p_or_n}11}{{4other}11}
{{5digit}7} {{5p_or_n}6}
{{6digit}7}
{{7digit}7} {{7p_or_n}11} {{7other}11}
{{8digit}8} {{8letter}8} {{8other}12}
{{9delimeter}10}{{9other}14}
{{10other}13}
};

vector identifiers; //标识符表
vector constants; //常数表

//token
struct Token
{
int _code;
int _value;
Token() = default;
Token(int c int v) :_code(c) _value(v) {}
~Token() = default;
};
vector token_seq; //token序列
string curr_token; //当前单词
int n p m e t; //尾数值,指数值,小数位数,指数符号,类型
double constant; //常数值
string buffer; //源程序缓冲区
int i; //源程序缓冲区指针,当前字符为buffer[i]


void act(int); //状态为state时的操作
int find(int char); //state接受value后的下一个状态
int insert_constant(double); //插入常数constant到常数表,返回constant在常数表的位置
int reserve(const string &); //返回界符在keywords中的位置
int insert_identifier(string &); //插入标识符identifier到符号表,返回identifier在符号表的位置
Type transform(char);



int main(int argc char *argv[]) {
//参数不足
if (argc != 2) {
cout << “Missing enough arguments at least 1: “ << endl;
exit(1);
}
string fileName = argv[1];
ifstream in(fileName ios::in);
if (in.fail()) {
cout << “fail in opening “ << fileName << “ !“ << endl;
exit(2);
}
int curr_state; //当前状态
//从文件流in中读取一行保存到字符串buffer中
while (getline(in buffer)) {
i = 0; //从buffer的第一个字符开始

do {
while (buffer[i] == ‘ ‘) { //过滤空格
i++;
}

//判定一个单词首字符的类别
//字母
if (buffer[i] >= ‘a‘ && buffer[i] <= ‘z‘) {
type = letter;
}
//数字
else if (buffer[i] >= ‘0‘ && buffer[i] <= ‘9‘) {
type = digit;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\
     目录           0  2020-10-20 21:45  编译方法实验源代码+实验报告+大作业\大作业\
     文件      287980  2020-10-20 21:42  编译方法实验源代码+实验报告+大作业\大作业\大作业.docx
     目录           0  2020-10-20 21:45  编译方法实验源代码+实验报告+大作业\实验报告\
     文件     2604994  2020-10-20 21:43  编译方法实验源代码+实验报告+大作业\实验报告\实验报告.docx
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\源代码\
     文件          71  2020-04-18 23:02  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\源代码\exa.txt
     文件          35  2020-04-18 23:04  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\源代码\exa2.txt
     文件        8756  2020-04-19 10:35  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\源代码\experiment1.cpp
     文件       44544  2020-04-18 22:43  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\源代码\experiment1.exe
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\异常处理\
     文件       40713  2020-04-18 22:49  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\异常处理\参数缺失.jpg
     文件       39419  2020-04-18 22:51  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\异常处理\文件不存在.jpg
     文件       66112  2020-04-18 22:59  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\异常处理\词法错误.jpg
     文件       74372  2020-04-18 23:00  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\异常处理\非法字符.jpg
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\正常结果\
     文件       66930  2020-04-18 23:09  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\正常结果\合法输出1.jpg
     文件       54020  2020-04-18 23:04  编译方法实验源代码+实验报告+大作业\实验源代码\实验1\运行结果\正常结果\合法输出2.jpg
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\
     文件         615  2020-04-17 00:12  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\README.md
     文件     1270269  2020-04-17 09:15  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\实验概览.png
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\
     文件      325632  2020-04-17 00:05  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\experiment2.exe
     文件          56  2020-04-16 23:05  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\grammer.txt
     文件          70  2020-04-16 10:38  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\grammer2.txt
     文件       16372  2020-04-17 00:10  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\main.cpp
     文件         833  2020-04-17 00:10  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\源代码\util.h
     目录           0  2020-07-29 11:42  编译方法实验源代码+实验报告+大作业\实验源代码\实验2\运行结果\
............此处省略15个文件信息

评论

共有 条评论