【编译原理】五、简单四则运算的代码实现

1. 前言

前面说了那么多BNF的相关理论知识,实际上就是为了一个目的:

描述语法规则

描述语法规则是一切的开始。最终,还是要用代码来实现。

如果对于BNF仍然是一头雾水,也没关系,因为我们的最终目的是编写解析器,从现在开始,我们的重点应该放到编码上。

编写代码需要注意的问题,以及编写思路,并不是一个公式就能描述的,有非常多的细节需要处理,编码实现是理论知识的一个升级。在编写代码的过程中,我们可以加强对理论的理解,加强理论理解同时又能编写复杂的解析代码,正所谓:“理论要联系实际”。

2. 编码实现

在上一篇文章 【编译原理】四、编写简单四则运算的EBNF 中,我们编写出了基本的加减乘除四则运算的EBNF,现在我们就基于此生成式进行代码实现。

2.1 项目地址

https://gitee.com/pivotfuture/four-arithmetic
此项目为Qt项目,没有别的原因,就是因为Qt好用,开发效率高,不用复杂配置即可使用。

2.2 实现逻辑

上述项目实现逻辑的图解如下所示:

请添加图片描述

此项目使用C++面向对象的方法进行代码组织,并不是使用纯C开发。个人认为纯C开发虽然效率可能比较高,但是众多的全局变量,众多的函数,看起来比较零散,没有非常清晰的结构,理解上比较困难。

3. 总结

本文主要讲了简单四则运算的代码实现,还是要亲自阅读和调试代码才可以更加深入的理解。在有一定的理解以后,非常建议读者能从0开始编写,这样会加深理解,同时非常有成就感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55209.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sklearn中使用决策树

1.示例 criterion可以是信息熵,entropy,可以是基尼系数gini # -*-coding:utf-8-*- from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wineload_wine()# print ( wine.feature_…

XXL-JOB定时任务框架(Oracle定制版)

特点 xxl-job是一个轻量级、易扩展的分布式任务调度平台,能够快速开发和简单学习。开放源代码并被多家公司线上产品使用,开箱即用。尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xxl-job是针对MySQL设计的&#xff…

Java中HashMap原理与分析

HashMap的底层数据结构 HashMap是以Key-Value的方式进行数据结构存储的一种数据结构。 JDK1.7采用的是数组链表,使用Entry类存储key和value JDK1.8采用的是数组链表/红黑树,使用Node类存储key和value。 HashMap扩容为什么总是2的次幂 HashMap扩容主要…

原型链污染

文章目录 1. javascript 原型链2. 原型链变量的搜索3. prototype 原型链污染4. 原型链污染例题4.1 题1:4.2.题2: 1. javascript 原型链 js在ECS6之前没有类的概念,之前的类都是用funtion来声明的。如下 可以看到b在实例化为test对象以后&…

【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 一、要实现的功能 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。…

File 类和 InputStream, OutputStream 的用法总结

目录 一、File 类 1.File类属性 2.构造方法 3.普通方法 二、InputStream 1.方法 2.FileInputStream 三、OutputStream 1.方法 2.FileOutputStream 四、针对字符流对象进行读写操作 一、File 类 1.File类属性 修饰符及类型属性说明static StringpathSeparator依赖于系统的路…

echarts 饼图的label放置于labelLine引导线上方

一般的饼图基础配置后长这样。 想要实现将文本放置在引导线上方,效果长这样 const options {// ...series: [{label: {padding: [0, -40],},labelLine: {length: 10,length2: 50,},labelLayout: {verticalAlign: "bottom",dy: -10,},},], };label.padd…

教您一招解决找素材困难好的方法

创作视频内容时,找到合适的素材是至关重要的。然而,有时候寻找视频素材可能会变得困难。本文将分享一些实用的方法,帮助您轻松解决找视频素材困难的问题。 素材库和在线平台是寻找视频素材的首选方法。 利用专业的视频剪辑工具 在电脑上安…

linux-MySQL的数据目录

总结: window中的my.ini linux 中 /etc/my.cnfwindow中的D:\soft\mysql-5.7.35-winx64\data linux 中 /var/lib/mysql 1.查找与mysql有关的目录 find / -name mysql [rootVM-4-6-centos etc]# find / -name mysql /opt/mysql /etc/selinux/targeted/tmp/modul…

MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例

一、找到工具箱存放位置 首先我们需要找到工具箱的存放位置,点击这个设置路径可以看到 我们的matlab工具箱的存放位置 C:\Program Files\MATLAB\R2023a\toolbox\matlab 从资源管理器中打开这个位置,可以看到里面各种工具箱 二、放入工具箱 解压我们…

Windows server上用nginx部署vue3项目

Windows server上用nginx部署vue3项目 一、Node中node_modules文件夹及package.json文件的作用说明二、VUE3项目打包三、Windows Server上的Nginx部署 一、Node中node_modules文件夹及package.json文件的作用说明 node_modules是安装node后用来存放用包管理工具下载安装的包的…

Linux中安装Node

安装 先从 官方网站 下载安装包,有时 node 版本太新会导致失败,详见下方的常见问题第2点 cd /home // 创建目录,将下载好的 node 安装包上传到此目录 mkdir Download mkdir /usr/local/lib/node解压 // 解压,前面是文件当前路径…