项目github地址及源码:

https://github.com/yunwei37/tryC​github.com

这一章开始进入解释器的核心部分: 语法分析器;

我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算tryC中的表达式。

基本概念

就像之前所说的那样,语法分析指将词法分析得到的标记流(token)进行分析,组成事先定义好的有意义的语句。那么如何完成这样一个工作呢?我们可以借助一个叫“BNF”的数学工具。

BNF与上下文无关文法

Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述Algol 60编程语言的语法。

BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。

BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为:

exp 

其中'|'用于表示可选择的不同项,"->"用于表示推导规则,从产生式左边的符号可以推导出产生式右边的符号;

要解析一个表达式,我们可以完成这样一个替换:对于

(

可以替换为

exp 

其中我们把能够被替换的符号叫做非终结符,不能被替换的叫做终结符。

上下文无关文法就是说,这个文法中所有的产生式左边只有一个非终结符,就像上面写的那个文法一样。通常我们在编译器构建中使用的都是上下文无关文法。

EBNF

EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号"[ .... ]" 表示可选部分,用花括号"{ ... }"表示重复出现的部分,如上面那个文法可以改写为:

exp 

又比如对于if语句可以写成:

if

递归下降文法

递归下降分析法也很简单,就是用函数的调用来模拟BNF的替换过程,我们只需要为每个非终结符定义一个分解函数,它就能从起始非终结符开始,不断地调用非终结符的分解函数,不断地对非终结符进行分解,直到匹配输入的终结符。

当然,递归下降分析并不是对于所有的文法都能正常使用的,例如经典的左递归问题:比如这样一个文法

exp 

对于exp的替换需要调用exp的分解函数,而exp的分解函数一进来就调用它自身(即最左边的符号),就会导致无限递归。这时就需要对文法进行改造。

实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。

来看看怎样用递归下降文法计算tryC中的表达式

上面说了一大堆,现在看看实际的计算表达式的实现是怎样的呢

算术表达式

tryC中需要计算四则运算表达式的EBNF文法如下:

exp 

这里对文法进行了一定的改造,让它能够正确表达四则运算的优先级,同时避免了左递归的问题,具体可以自己试着验证一下。

tryC中算术表达式具体的代码实现(就是上述文法直接转换过来的啦):

(在下一篇文章中还会提及表达式中对变量的处理过程)

double 

布尔表达式

tryC中同样设计了布尔表达式:

tryC中需要计算四则运算表达式的EBNF文法如下:

boolOR 

代码实现:

int 

一些重要概念

  • 终结符/非终结符
  • BNF/EBNF
  • 上下文无关文法
  • 递归下降法

可对照源码查看(如果觉得写得还行麻烦您帮我点个star哦)

https://github.com/yunwei37/tryC​github.com

ROST情感分析的语法规则_用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1...相关推荐

  1. 搞笑视频分析---2、爱做饭的芋头:手搓冰粉

    搞笑视频分析---2.爱做饭的芋头:手搓冰粉 一.总结 一句话总结: 哪些搞笑视频和搞笑音频片段就可以起到很好的效果 1.搞怪语句? 冰粉粉就是粉粉,然后煮到咕噜咕噜咕噜咕噜沸腾 但是你可能会怀疑,这 ...

  2. 情感分析朴素贝叶斯_朴素贝叶斯推文的情感分析

    情感分析朴素贝叶斯 Millions of tweets are posted every second. It helps us know how the public is responding ...

  3. python评论情感分析计算分数值_使用python对淘宝评论进行情感分析并绘制词云

    淘宝商品评论分析系统简介 截至2018年12月,我国网络购物用户规模达6.10亿,网购已经慢慢占据了我们生活的方方面面,所以一份透明的网购指南就显得尤为重要. 大部分网购消费群体只能依赖于其他人在商品 ...

  4. mysql 名次语法规则_基于sql语句的一些常用语法积累总结

    1.当某一字段的值希望通过其它字值显示出来时(记录转换),可通过下面的语句实现:case Type when '1' then '普通通道' when '2' then '高端通道' end as T ...

  5. matlab的基本语法规则_【经验交流】matlab自定义回调函数语法规则

    给出我今天学到的两个例子来说明两种用法: (1)set(h, 'StartFcn', @myfile)型 function [varargout] = XIE_bwmorphfig(Size, var ...

  6. node 压缩图片_手搓一个TinyPng压缩图片的WebpackPlugin

    作者: JowayYoung 转发链接:https://mp.weixin.qq.com/s/eqsZwZPCX-GZyB-EOm3TwQ 前言 曾经发表过一篇性能优化的文章<「实践」细聊前端性 ...

  7. node 压缩图片_嗯,手搓一个TinyPng压缩图片的WebpackPlugin也SoEasy啦

    作者:JowayYoung 仓库:Github.CodePen 博客:掘金.思否.知乎.简书.头条.CSDN 公众号:IQ前端 联系我:关注公众号后有我的微信哟 特别声明:原创不易,未经授权不得对此文 ...

  8. 一个connection对象可以创建一个或一个以上的statement对象_从 0 开始手写一个 Mybatis 框架,三步搞定...

    来自:开源中国,作者:我叫刘半仙 链接:https://my.oschina.net/liughDevelop/blog/1631006 MyBatis框架的核心功能其实不难,无非就是动态代理和jdb ...

  9. java中长方体的类是什么_编写java程序:定义一个描述长方体的类Box,要求如下...

    匿名用户 1级 2011-10-12 回答 //这个方法,完全可以完成你的要求,希望你可以理解哦!!加油,祝你学习进步~~~ class Box { double width; double heig ...

  10. local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架

    @[TOC] 自定义实现Spring Mvc框架 前言 在使用Spring Mvc时候我们需要配置一个中央处理器DispatcherServlet用于分发请求,根据url查找处理器,然后再根据处理器 ...

最新文章

  1. 开发者被要求向破解者道歉,竟揪出“阿里云假员工”,网友:这人有前科
  2. MATLAB_11-图像特征
  3. NR 5G 测量与寻呼
  4. Kafka事务特性详解
  5. docker安装Tomcat
  6. Spring –持久层–编写实体并配置Hibernate
  7. 机器人吴非_Nature封面:8天做完688个实验,每天工作21.5小时,实验机器人展现超强战斗力...
  8. 详解nodejs中express搭建权限管理系统
  9. 前端安全究竟该怎么做?从一个安全漏洞说起......
  10. 关于跨域获取cookie问题的解决
  11. laravel 的用户认证
  12. 浅谈Vue 中的 computed 和 methods 的使用
  13. ios 输入法扩展_iOS8、iOS9都可用的原生输入法扩展词库(搜狗词库)
  14. mariadb镜像使用教程(一)
  15. 计算机视觉笔记及资料整理(含图像分割、目标检测)
  16. 示波器基础知识100问
  17. python从事软件测试_软件测试自学到什么程度可以开始找工作
  18. 2021蓝牙耳机选购清单:高颜值、高颜值、降噪,五款蓝牙耳机推荐
  19. 电脑移动硬盘清理不出垃圾怎么办
  20. 国盛源投资量化买卖一定会挣钱吗?量化买卖怎样挣钱的?

热门文章

  1. 在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理
  2. Fiddler2用于手机抓包时的配置方法
  3. 谈谈作为DBA我对MySQL数据库优化的理解
  4. map转json与json 转map
  5. python 将txt文件转换为excel_Python实现读取txt文件并转换为excel的方法示例
  6. Git小乌龟汉化步骤
  7. windows2012R2 无系统盘 安装netframe3.5 (需连公网)
  8. Fortran代码C化或Fortran与C/C++混编过程中矩阵转置的实现
  9. IntelliJ IDEA搭建Hadoop开发环境(上)
  10. 火山PC编辑框组件详解1