前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编译原理】S语言词法分析器设计-附雪景图

【编译原理】S语言词法分析器设计-附雪景图

作者头像
NorthS
发布2023-03-21 21:23:47
4450
发布2023-03-21 21:23:47
举报
文章被收录于专栏:北冥博客

墨迹几

前几天下雪了,不知道为啥一到下雪或是下雨就有些淡淡的忧郁,但是雪还是很漂亮的,分享一下我拍的雪景图和剪的视频吧(其实就是配了段音乐),希望我们每个在努力路上的人都会有一路美好的风景吧,祝我们终将成功。

图片[1]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客
图片[1]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客
图片[2]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客
图片[2]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客
图片[3]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客
图片[3]-【编译原理】S语言词法分析器设计-附雪景图-北冥博客

正题开始

最近老师让做一次实验,一直没有关注过,但是明天要验收了(危),所以今天开始新建文件夹,写的很急,还有很多需要优化的地方,作为小白发出了也和大家一起交流下,这次我是分文件写的,因为考虑到以后的实验都用这一套代码,分文件写方便一点,用的是C++14标准

compilerwork.h

首先是一个库文件,声明各种函数以及定义常量

代码语言:javascript
复制
//
// 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里面是各种函数的实现

代码语言:javascript
复制
//
// 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

主函数,感觉耦合度太高了(别忘了换路径!!!)

测试数据

这也是实验中给出的测试数据

代码语言:javascript
复制
//aa.c
void  aa( )
begin
    float  rate,circle;
    rate=3;
    circle=3.14*rate*rate;
end

可优化

  1. 二元式拼接过程那可以定义成一个函数
  2. 对识别出的数字字符串进行转化,判断其是否是”真“数字
  3. 对于每一种字符串的判别可以单独出来
  4. 对注释的判别不用太过复杂,我这有点类似于语法分析了(老师指正)
  5. 还有什么想法欢迎一起交流!

温馨提示:本文最后更新于2022-03-26,若文件或内容有错误或已失效,请在下方留言

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年03月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 墨迹几
    • 正题开始
      • compilerwork.h
        • handle.cpp
          • main.cpp
            • 测试数据
              • 可优化
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档