当前位置: 首页 > news >正文

词法、语法、语义分析编译原理设计

目录
1 目的 4
2 设计思路与实现 4
2.1 编译过程概述 4
2.2 Flex与Bison工具的简介 5
2.2.1 Flex文件内容结构 5
2.2.2 Bison文件内容结构 6
2.2.3 Flex-Bison协作关系 6
2.2.4 结构体含义 7
2.3 文法的设计 7
3 程序实现 8
3.1 程序总体思想 8
3.2 词法分析设计 8
3.3 语法分析设计 9
3.4 抽象语法树的生成 12
3.5 AST图片的设计 13
3.6 MakeFile文件的设计 14
4 测试用例以及实验结果 15
4.1 文件测试用例 15
4.2 使用说明 15
4.3 文件测试 15
4.3.1 文件1测试 15
4.3.2 文件2测试 18
4.3.3 文件3测试 20
5 技术问题以及解决方案 22
5.1 技术问题 22
5.2 心得体会 23
6 备注 23
3程序实现
3.1程序总体思想
首先应当对使用指定文法的源文件进行词法分析,将整个文本分解为一个一个词素,然后 为每个终结符建立一个语法节点。将上述过程看作是一个解析函数,每次调用就生成语法节点 并返回词素的类型。
接着需要对其进行语法分析(事实上词法分析和语法分析是同时进行的)。使用 LR 分析技 术,按照产生式规则生成项集,然后构造项集的 goto 函数。此过程事实上完成了一个可以识别 此文法的 DFA,根据此 DFA 构造此文法的语法分析表,接着根据上一步词法分析器返回的终结 符类型来选择执行移入或规约的动作,在规约的同时生成新的语法节点并使其与子语法节点建 立连接关系。重复以上直到状态栈中的状态达到 Acc 也就是接收状态,说明输入字符串被此文 法接收。
上述动作执行完毕后,即构造出一棵完整的抽象语法树。
3.2词法分析设计
词法分析过程借助GNU Flex工具使用正则表达式描述每一个单词的组成,即Flex会为每一个单词构建相应的DFA,其作用是构造出相应的yylex()函数,返回下一个输入流的单词类型,同时yyparse()函数每一次的语法分析,都需要调用相应的yylex()函数。利用Flex工具会生成lex.yy.c文件,该文件中包含了对于词法分析的相应的函数等。
本文转载自:http://www.biyezuopin.vip/onews.asp?id=15780

#include <stdio.h>
#include <unistd.h>
#include "node.h"

int yyparse(struct Node **);

int main(int argc, char **argv) {
  int mode = 1;
  char ch;
  fp = fopen("cifafenxi.txt", "w+"); //打开存词法分析的文件
  fprintf(fp,"%s","..........词法分析结果为.............\n");
  fprintf(fp,"%s","类型   Token   符号\n");
  while ((ch = getopt(argc, argv, "tc")) != -1) {
    switch (ch) {
    case 't':
      mode = 0;
      break;
    case 'c':
      mode = 1;
      break;
    default:
      fprintf(stderr, "unknown option: %c\n", ch);
    }
  }
  // 抽象语法树
  struct Node *AST;
  if (yyparse(&AST) == 0) {
    if (mode) {
      genTAC(AST);
    } else {
      printAST(AST);
    }
  }
  fclose(fp);
  return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • mybatis的小于号<的转义
  • IC Compiler指南——布图规划(一)
  • 债券行情查询接口
  • Flask 学习-28.flask_jwt_extended插件 JWT 中存储额外数据(additional_claims)
  • Unity 场景光照出现问题
  • SpringCloud Feign报错Method has too many Body parameters
  • 如何让GPU加速20倍?AI数据平台是关键!
  • 通达OA系统,MYOA中OfficeRedis启动不了
  • ‘scp‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  • Kubernetes中gRPC的服务发现
  • 基于后退走廊的轨迹优化方法(Bubble Planner)
  • Golang并发模式
  • elasticsearch 内存大小设置
  • 插入后获取主键id(tkMapper)
  • elasticsearch 修改默认最大分片数
  • [NodeJS] 关于Buffer
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • centos安装java运行环境jdk+tomcat
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • egg(89)--egg之redis的发布和订阅
  • JS函数式编程 数组部分风格 ES6版
  • Vue组件定义
  • win10下安装mysql5.7
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 批量截取pdf文件
  • 嵌入式文件系统
  • 如何设计一个微型分布式架构?
  • 算法---两个栈实现一个队列
  • 一个JAVA程序员成长之路分享
  • 你对linux中grep命令知道多少?
  • Mac 上flink的安装与启动
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (1) caustics\
  • (1)SpringCloud 整合Python
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (31)对象的克隆
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 8.0 发布到 IIS
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net 知识杂记
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • /dev下添加设备节点的方法步骤(通过device_create)
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [Android]使用Android打包Unity工程