学习记录,可能有很多不足,请谅解。

基本按照教材方法



注意本次词法分析只分析上图中拥有的

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;string reservewords[] = { "while","if","else","int","print"};//保留字
char character;//单个字符
string token;//一串字符
string yuyan;//语法分析结果
int numbers[9];//常量储存
int numberid = 0;
int wordsid = 0;
int boolflag;//储存id。转换。
int boolflag1;
int boolflag2;
bool elseflag=false;//判断else是否可执行
int whileflag=0;//判断while是否可执行
struct word
{string name;int value;
}words[9];//变量储存bool digit() {//是否为数字return character >= '0' && character <= '9' ? 1 : 0;
}void getbe() {//去除空格while (1) {if (character == ' ') {character = getchar();}else {break;}}
}bool letter() {//是否为字符return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') ? 1 : 0;
}void concatenation() {//连接字符串token = token + character;
}int reserve() {//判断是否为保留字int id = 0;for (auto s : reservewords) {id++;if (s==token) {return id;}}return 0;
}int word() {//判断变量是否存在int id = 0;for (int i = 0; i < 10;i++) {id++;string s = words[i].name;if (s==token) {return id;}}return 0;
}int number() {//判断常量是否存在for (int i = 0; i <= numberid;i++) {if (numbers[i]== atoi(token.c_str())) {return i+1;}}return 0;
}int main()
{freopen("chenxu.txt", "r", stdin);//读取土木character = getchar();while (character!=EOF) {//词法分析getbe();if (letter()) {while (letter() || digit()) {concatenation();character = getchar();}boolflag = reserve();if (boolflag!= 0) {yuyan += '_';yuyan += (boolflag + '0');token = "";}else {boolflag = word();if (boolflag != 0) {yuyan += '@';yuyan += (boolflag + '0');}else {words[wordsid].name= token;words[wordsid].value = 0;yuyan += '@';yuyan += ((wordsid+1) + '0');wordsid++;}token = "";}}else if (digit()) {while (digit()) {concatenation();character = getchar();}boolflag = number();if (boolflag != 0) {yuyan += '$';yuyan += (boolflag + '0');}else {int n = atoi(token.c_str());numbers[numberid] = n;yuyan += '$';yuyan += ((numberid + 1) + '0');numberid++;}token = "";}else if (character == '+') {yuyan += character;character = getchar();}else if (character == '-') {yuyan += character;character = getchar();}else if (character == '=') {yuyan += character;character = getchar();}else if (character == '>') {int flag = 0;character = getchar();if (character == '=') {flag = 1;yuyan += '>';yuyan += character;character = getchar();}if (flag == 0) {yuyan += '>';}}else if (character == '<') {yuyan += character;character = getchar();}else if (character == '(') {yuyan += character;character = getchar();}else if (character == ')') {yuyan += character;character = getchar();}else if (character == '{') {yuyan += character;character = getchar();}else if (character == '}') {yuyan += character;character = getchar();}else if (character == ';') {yuyan += character;character = getchar();}else {character = getchar();continue;}}cout << yuyan;cout << endl;
}

上面是词法分析,下为文法分析,因为文法分析当时只做到了能分析老师给的特定序列并输出结果,所以文法分析存在很多问题,1. if和else依然一对一匹配,但是if和else中间可以穿插其他语句。可以在程序中写判断大小的句子,作为中断判定,如果判断失败,则作为断点中断程序,如果判断成功,就继续程序。while中只能再出现while或一个计算式等

在代码中添加函数


int bds(int i) {//单个式子文法if (yuyan[i] == '@') {i++;character = yuyan[i];if (digit()) {boolflag = character - '0';i++;character = yuyan[i];if (character == '='){i++;character = yuyan[i];if (yuyan[i] == '@') {i++;character = yuyan[i];if (digit()) {boolflag1 = character - '0';i++;character = yuyan[i];if (character == '+'){i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag2 = character - '0';i++;character = yuyan[i];if (character == ';'){words[boolflag - 1].value = words[boolflag1 - 1].value + numbers[boolflag2 - 1];i++;return i;}else {return 0;}}else {return 0;}}else {return 0;}}else if (character == '-') {i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag2 = character - '0';i++;character = yuyan[i];if (character == ';'){words[boolflag - 1].value = words[boolflag1 - 1].value - numbers[boolflag2 - 1];i++;return i;}else {return 0;}}else {return 0;}}else {return 0;}}else {return 0;}}else {return 0;}}}else if (character == '>') {i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag1 = character - '0';if (words[boolflag - 1].value > numbers[boolflag1-1]) {i++;return i;}else {return -1;}}else {return 0;}}else if (character == '=') {i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag1 = character - '0';if (words[boolflag - 1].value >= numbers[boolflag1-1]) {i++;return i;}else {return -1;}}else {return 0;}}else {return 0;}}else {return 0;}}else if (character == '<') {i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag1 = character - '0';if (words[boolflag - 1].value < numbers[boolflag1-1]) {i++;return i;}else {return -1;}}else {return 0;}}else {return 0;}}else {return 0;}}else {return 0;}}else {return 0;}
}int whilesx(int i) {//循环分析int j = i;i++;int aa = bds(i);if (aa > 0) {i = aa;character = yuyan[i];if (character == ')') {i++;character = yuyan[i];if (character == '{') {i++;character = yuyan[i];aa = bds(i);if (aa != 0) {i = aa;if (yuyan[i] == '}') {i++;whileflag = i;i = j;whileflag=whilesx(i);}else {return 0;}}else {if (character == '_') {i++;character = yuyan[i];if (yuyan[i] == '1') {i++;character = yuyan[i];if (yuyan[i] == '(') {whileflag=whilesx(i);i = j;whileflag=whilesx(i);}else {return 0;}}else {return 0;}}else {return 0;}}}else {return 0;}}else {return 0;}}else if (aa == -1) {if (whileflag == 0) {while (yuyan[i] != '}') {i++;}whileflag = i;return whileflag;}else {return whileflag;}}else {return 0;}
}

在main方法中添加

for (int i = 0; i < yuyan.length();) {//文法分析,输出结果character = yuyan[i];if (character == '_') {i++;character = yuyan[i];if (character == '1') {i++;character = yuyan[i];if (yuyan[i] == '(') {int aa = whilesx(i);if (aa == 0) {cout << "出错了"; break;}else {while (yuyan[aa] == '}') {aa++;}i = aa;}}else {cout << "出错了"; break;}}else if (character == '2') {elseflag = false;i++;character = yuyan[i];if (yuyan[i] == '(') {i++;int aa = bds(i);if (aa > 0) {elseflag = false;i = aa;character = yuyan[i];if (character == ')') {i++;character = yuyan[i];if (character == '{') {i++;character = yuyan[i];aa = bds(i);if (aa != 0) {i = aa;if (yuyan[i] == '}') {i++;continue;}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}else if (aa == -1) {elseflag = true;while (yuyan[i] != '}') {i++;}i++;}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}else if (character == '3') {if (elseflag == false) {while (yuyan[i] != '}') {i++;}i++;}else {i++;character = yuyan[i];if (yuyan[i] == '{') {i++;character = yuyan[i];int aa = bds(i);if (aa != 0) {i = aa;if (yuyan[i] == '}') {i++;continue;}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}else {cout << "出错了"; break;}}}else if (character == '4') {i++;character = yuyan[i];if (yuyan[i] == '@') {i++;character = yuyan[i];if (digit()) {boolflag = character - '0';i++;character = yuyan[i];if (character == '='){i++;character = yuyan[i];if (yuyan[i] == '$') {i++;character = yuyan[i];if (digit()) {boolflag1 = character - '0';i++;character = yuyan[i];if (character == ';'){words[boolflag - 1].value = numbers[boolflag1 - 1];i++;}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else if (character == '5') {i++;character = yuyan[i];if (yuyan[i] == '@') {i++;character = yuyan[i];if (digit()) {boolflag = character - '0';i++;character = yuyan[i];if (character == ';'){cout << words[boolflag - 1].value;i++;}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else {cout << "出错了";break;}}else { cout << "出错了"; break; }}else if (character == '@') {i = bds(i);if (i == 0) {cout << "出错了"; break;}if(i==-1){cout << "程序中断退出"; break;}}else {cout << "出错了"; break;}}

结果展示



感谢观看

c语言实现词法分析器+文法分析器(全代码)相关推荐

  1. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

  2. java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc

    西安邮电大学编译原理LL文法分析器实验(java) <编译原理>实验报告 题目: 语法分析器的制作 学生姓名: 班 级: 软件1202 学 号: 指导教师: 成 绩: 西安邮电大学计算机学 ...

  3. 第九十七期:新版Kite:实时补全代码,Python之父都发声力挺!

    不久前,一个免费的专门针对 Python 的代码补全工具 Kite,有了新的动态. 作者:杨鲤萍 本文转自雷锋网,如需转载请至雷锋网官网申请授权. 不久前,一个免费的专门针对 Python 的代码补全 ...

  4. 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦

    易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦, 带修改教程,带讲解说明, 简单易懂不需要别人指导在家可以自学. 降低新手编写多线程中控的门槛 ...

  5. VS Code能自己编程了,GitHub推出“AI程序员”插件,根据注释自动补全代码

    明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 描述出你想要执行的命令,就能生成相应的代码. 现在,GitHub官方和openAI联合为程序员们送上编程神器--GitHub Copilot ...

  6. 基于R语言一元线性回归模型实例及代码

    基于R语言一元线性回归模型实例及代码 题目描述 数据特征及可视化 建立模型与初步评价 (自己写lm()代码) 显著性检验 整体显著性检验 数学理论 系数显著性检验 代码实现系统显著性检验 回归诊断 异 ...

  7. R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码、tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例

    R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码.tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例 ...

  8. R语言广义线性模型Logistic回归案例代码

    R语言广义线性模型Logistic回归案例代码 在实际应用中,Logistic模型主要有三大用途: 1)寻找危险因素,找到某些影响因变量的"坏因素",一般可以通过优势比发现危险因素 ...

  9. 连连看html游戏全代码js、jquery操作

    连连看html游戏全代码js.jquery操作 运行图片 目录路径 连连看水果方块版.html 连连看算法 进行下一个游戏的开发! 注意事项 我会把html文件.css文件提供下载地址,文件夹路径也展 ...

最新文章

  1. 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.01更新)
  2. mxnet 常用层,卷积激活损失
  3. python 调用c/c++
  4. 如何形容自己的计算机水平,信息在计算机中的表示
  5. asp.net 利用jquery.form插件上传图片
  6. rk3128屏幕占空比参数设置_rk3128 — spdif dts配置
  7. 算法:判断是否是循环链表,并返回循环链表开始节点Linked List Cycle II
  8. 关于郑州大学校园网锐捷客户端禁止热点分享,禁止多网卡的解决办法
  9. 3DMax基础入门教程,命令面板的设置简介以及功能
  10. css文字不换行显示、超出显示点点点等实用性小记
  11. 快速读论文----Neighbor-Anchoring AdversarialGraph Neural Networks
  12. 计算合式公式(wff) 【让你的离散作业变的更轻松】
  13. 详解ZStack Cloud v4.0:自研VPC网络模型实践指南
  14. 【sdx62】PBL阶段修改GPIO操作
  15. 平板电脑:apple、中国挑大梁
  16. 什么是移动SEO?为什么移动搜索引擎优化很重要?
  17. 星辰变服务器响应超时,星辰变游戏出现突然安装不了怎么办 解决方案一览
  18. 赵小楼《天道》《遥远的救世主》解读(12)丁元英操盘私募基金这事
  19. 利用python和boto3包从amazon s3 bucket中下载数据
  20. 计算机无法正常启动无法修复,win10无法正常启动

热门文章

  1. java ee中ssh学后感_学习SSH,SSM框架有感
  2. 论文解读《Co-Correcting:Noise-tolerant Medical Image Classification via mutual Label Correction》
  3. java8 两个时间比较
  4. 方向余弦矩阵DCM刚体的矢量—矩阵描述
  5. 5毛VS600亿,食品安全问题是卫龙上市最大的拦路虎?
  6. 惊闻高中同学因公殉职
  7. 中国未来只有三种人:资源者、配置者、投资人
  8. MySQL批量导入Excel、txt数据
  9. linux下raid1数据恢复,在linux下做RAID1试验
  10. dorado获取用户登录信息