【编译原理】S语言词法分析器设计-附雪景图
2023-06-13 09:17:36 时间
墨迹几
前几天下雪了,不知道为啥一到下雪或是下雨就有些淡淡的忧郁,但是雪还是很漂亮的,分享一下我拍的雪景图和剪的视频吧(其实就是配了段音乐),希望我们每个在努力路上的人都会有一路美好的风景吧,祝我们终将成功。
正题开始
最近老师让做一次实验,一直没有关注过,但是明天要验收了(危),所以今天开始新建文件夹,写的很急,还有很多需要优化的地方,作为小白发出了也和大家一起交流下,这次我是分文件写的,因为考虑到以后的实验都用这一套代码,分文件写方便一点,用的是C++14标准
compilerwork.h
首先是一个库文件,声明各种函数以及定义常量
//
// Created by NorthS on 2022/3/20.
//
#ifndef COMPILERW_COMPILERWORK_H
#define COMPILERW_COMPILERWORK_H
#include <bits/stdc++.h>
using namespace std;
/*
* 判断字符是否是数字
*/
bool isNumber(char a);
/*
* 判断字符是否为字母
*/
bool isAlp(char a);
/*
* 去除字符串头部空格
*/
string trim(string str);
/*
* 判断是否为保留字
*/
bool isKeyWords(string str);
/*
* 判断标识符表中是否已存在该标识符
*/
bool isExistInr(vector<string> ins,string str);
/*
* 查找标识符在标识符中的位置
*/
int searchInrInInrs(vector<string> ins,string str);
/*
* 查找常数在常数表中的位置
*/
int searchCsatInCsats(vector<string> csats,string str);
#endif //COMPILER_COMPILERS_H
handle.cpp
这个handle里面是各种函数的实现
//
// Created by NorthS on 2022/3/20.
//
#include "compilerwork.h"
//保留字表
vector<string> words={"int","char","float","void","const","for","if","else","then","while","switch","break","begin","end"};
bool isNumber(char a) {
return a >= '0' && a <= '9';
}
bool isAlp(char a) {
return a >= 'a' && a < 'z' || a >= 'A' && a <= 'Z';
}
string trim(string str) {
str.erase(0, str.find_first_not_of(" \t"));
return str;
}
bool isKeyWords(string str){
for(int i=0;i<words.size();i++){
if(!words[i].compare(str)){
return true;
}
}
return false;
}
bool isExistInr(vector<string> ins,string str){
for(int i=0;i<ins.size();i++){
if(!ins[i].compare(str)){
return true;
}
}
return false;
}
int searchInrInInrs(vector<string> ins,string str){
for(int i=0;i<ins.size();i++){
if(!ins[i].compare(str)){
return i;
}
}
}
int searchCsatInCsats(vector<string> csats,string str){
for(int i=0;i<csats.size();i++){
if(!csats[i].compare(str)){
return i;
}
}
}
main.cpp
主函数,感觉耦合度太高了(别忘了换路径!!!)
测试数据
这也是实验中给出的测试数据
//aa.c
void aa( )
begin
float rate,circle;
rate=3;
circle=3.14*rate*rate;
end
可优化
- 二元式拼接过程那可以定义成一个函数
- 对识别出的数字字符串进行转化,判断其是否是”真“数字
- 对于每一种字符串的判别可以单独出来
- 对注释的判别不用太过复杂,我这有点类似于语法分析了(老师指正)
- 还有什么想法欢迎一起交流!
温馨提示:本文最后更新于2022-03-26
,若文件或内容有错误或已失效,请在下方留言。
相关文章
- 两分钟录音就可秒变语言通!火山语音音色复刻技术如何修炼而成?
- 快速排序(Java语言实现)
- 【说站】c语言中assert函数是什么
- 【测开技能】Java语言系列(一)Java入门
- matlab实现香农编码原理_香农编码c语言实现
- Go语言 字符串加密
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- Solidity智能合约开发语言讲解及原理说明
- 编译原理词法分析程序c语言_编译器常用的语法分析方法
- Go 语言 errgroup 库的使用方式和实现原理
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- 2023-03-14:读取摄像头,并且显示视频。代码用go语言编写。
- 【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
- 【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密 | 非对称加密 | 散列函数 )
- Go语言make和new关键字的区别及实现原理
- Go语言ICMP协议:向主机发送消息
- 深入剖析:探索Linux内核下的C语言编程技巧(linux内核的c语言)
- 语言Linux环境下使用ODBC操作C语言编写数据库(linux odbc c)
- Linux平台上C语言接口调用Java语言实现(linux c调java)
- 如何使用Lua语言连接Redis(如何lua redis)
- 了解WEB页面工具语言XML(一)产生背景
- c语言冒泡排序法代码