#include <iostream>
#include <sstream>
#include <unordered_map>
#include <vector>
using namespace std;
// 定义符号类型枚举
enum SymbolType {
VAR, INTEGER, BEGIN, END, IF, THEN, ELSE, WHILE, DO, ASSIGN, PLUS, MINUS,
MULTIPLY, DIVIDE, EQUAL, NOTEQUAL, LESS, LESSEQ, GREATER, GREATEREQ,
SEMICOLON, LEFTPAREN, RIGHTPAREN, IDENTIFIER, UNSIGNEDINT, SINGLEQUOTE, PERIOD, COMMA
};
// 符号结构体
struct Symbol {
SymbolType type; // 符号类型
string value; // 符号值
Symbol(SymbolType t, string val) : type(t), value(val) {}
};
//四元式结构体
struct Quadruple {
string op; // 操作符
string arg1; // 第一个操作数
string arg2; // 第二个操作数
string result; // 结果
string keyword; // 关键字
Quadruple(string op, string arg1, string arg2, string result, string keyword)
: op(op), arg1(arg1), arg2(arg2), result(result), keyword(keyword) {}
};
unordered_map<string, int> symbolTable;
vector<string> intermediateCode;
// PASCAL子集的词法分析器
class PascalLexer {
private:
string input; // 输入字符串
vector<Symbol> symbols; // 识别的符号序列
bool isLetter(char c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}
bool isDigit(char c) {
return c >= '0' && c <= '9';
}
void addSymbol(SymbolType type, string value) {
symbols.emplace_back(type, value);
}
public:
PascalLexer(string str) : input(str) {}
vector<Symbol> getSymbols() {
return symbols;
}
void tokenize() {
size_t pos = 0;
size_t len = input.length();
while (pos < len) {
char ch = input[pos];
if (ch == ' ' || ch == '\t' || ch == '\n') {
pos++;
continue; // 忽略空格、制表符和换行符
}
//判断是否是字母
if (isLetter(ch)) {
string identifier;
while (pos < len && (isLetter(ch) || isDigit(ch))) {
identifier += ch;
pos++;
ch = input[pos];
}
addSymbol(IDENTIFIER, identifier);
} //判断是否是数字
else if (isDigit(ch)) {
string unsignedInt;
while (pos < len && isDigit(ch)) {
unsignedInt += ch;
pos++;
ch = input[pos];
}
addSymbol(UNSIGNEDINT, unsignedInt);
}
else {
switch (ch) {
case ':':
if (pos + 1 < len && input[pos + 1] == '=') {
addSymbol(ASSIGN, ":=");
pos += 2;
}
else if (pos + 1 < len && input[pos + 1] == ' ') {
addSymbol(INTEGER, ": ");
pos += 2;
}
else {
// 错误处理,不符合语法规则
cout << "Error: Unexpected symbol at position " << pos << endl;
return;
}
break;
case '\'':
addSymbol(SINGLEQUOTE, "'");
pos++;
break;
case '+':
addSymbol(PLUS, "+");
pos++;
break;
case '-':
addSymbol(MINUS, "-");
pos++;
break;
case '*':
addSymbol(MULTIPLY, "*");
pos++;
break;
case '/':
addSymbol(DIVIDE, "/");
pos++;
break;
case '=':
addSymbol(EQUAL, "=");
pos++;
break;
case '<':
if (pos + 1 < len && input[pos + 1] == '=') {
addSymbol(LESSEQ, "<=");
pos += 2;
}
else {
addSymbol(LESS, "<");
pos++;
}
break;
case '>':
if (pos + 1 < len && input[pos + 1] == '=') {
addSymbol(GREATEREQ, ">=");
pos += 2;
}
else {
addSymbol(GREATER, ">");
pos++;
}
break;
case ';':
addSymbol(SEMICOLON, ";");
pos++;
break;
case '(':
addSymbol(LEFTPAREN, "(");
pos++;
break;
case ')':
addSymbol(RIGHTPAREN, ")");
pos++;
break;
case ',':
addSymbol(COMMA, ",");
pos++;
break;
case '.':
addSymbol(PERIOD, ".");
pos++;
break;
default:
// 错误处理,不符合语法规则
cout << "Error: Unexpected symbol at position " << pos << endl;
return;
}
}
}
}
};
//语法分析
class SyntaxAnalyzer {
private:
//表示当前解析的位置
int position = 0;
vector<Symbol> symbols;
//标志当前进行递归语法检查的次数
int has = 0;
//判断是否是字母
bool isAlphaString(const string& str) {
for (char c : str) {
if (!isalpha(c)) {
return false; // 字符串中含有非字母字符,返回false
}
}
return true; // 字符串中所有字符都是字母,返回true
}
//判断是否是数字
bool isDigitString(const string& str) {
for (char c : str) {
if (!isdigit(c)) {
return false; // 字符串中含有非字母字符,返回false
}
}
return true; // 字符串中所有字符都是字母,返回true
}
//判断是否是关键字
bool isKeyword(string str) {
if (str == "var" || str == "begin" || str == "if" || str == "then" || str == "else" || str == "while" || str == "do" || str == "end")
return true;
else
return false;
}
//判断是否是算术符号
bool isSymbol(const string& str) {
for (char c : str) {
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')')
return true;
else
break;
}
return false;
}
//判断是否是不等式
bool isnext(const string& str) {
for (char c : str) {
if (c == '>' || c == '<')
return true;
else
break;
}
return false;
}
//移动位置position
int move(int p) {
p = p - 2;
return p;
}
//判断是否结束
bool isEnd(const string& str) {
for (char c : str) {
if (c == ';' || c == '.')
return true;
else
break;
}
return false;
}
public:
SyntaxAnalyzer(vector<Symbol> strs){
symbols = strs;
}
//表达式分析
void term() {
if (position
没有合适的资源?快使用搜索试试~ 我知道了~
编译原理词法分析、语法分析和中间代码四元式生成
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共34个文件
tlog:8个
vsidx:5个
pdb:2个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 5 4 下载量 87 浏览量
2024-05-25
18:16:56
上传
评论 1
收藏 32.03MB ZIP 举报
温馨提示
使用C++语言实现了一个简单的中间代码生成器,包括词法分析、语义分析以及中间代码四元式的生成,可以对while循环和if-else语句进行分析。
资源推荐
资源详情
资源评论
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 34 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
n123xxx
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 《昇思25天学习打卡营第4天 - mindspore Transforms 数据变换常见用法》
- 1_《数据库开发与应用》练习卷.docx
- IMG_8480.JPG
- 2000-2022年上市公司数字化转型与绿色创新质量匹配数据(含控制变量)
- IMG_20240630_223816.jpg
- ADS285 Typical Application
- 求实数和的函数教程.docx
- 2023-04-06-项目笔记 - 第一百八十阶段 - 4.4.2.178全局变量的作用域-178 -2024.06.30
- hadoop进行数据分析教程.docx
- 数据挖掘与数据分析应用案例 数据挖掘算法实践 基于Python的用杰卡德相似算法来进行相似度计算.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)