七天开发基于编译原理的公式计算器设计与实现-第二天

283 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

补充上节摘要

基于程序设计语言的编译原理,给出了表达式计算器的系统设计过程,并在DevC++下使用面向过程的技术实现了计算器。该计算器能分析用户输入的表达式是否正确,对于符合运算规则的表达式进行计算并输出结果。实现了加、减、乘、除、取模、求幂运算的功能,并能通过添加括号来改变运算的先后顺序,从而得到预期的运算结果。

2使用的基本概念和原理

2.1相关概念

2.1.1 DFA

一个确定有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z)其中

① K是一个有穷集,它的每个元素称为一个状态;

② Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号字母表;

③ f是转换函数,是K×Σ→K上的映射(且可以是部分函数),即,如 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;

④ S ∈ K是唯一的一个初态;

⑤ Z⊂K是一个终态集,终态也称可接受状态或结束状态。

2.1.2 First集合定义

image.png

2.1.3 Follow集合定义

image.png

2.1.4 Select集合定义

image.png

2.1.5 LL(1)文法定义

image.png 本项目用到的DFA如下图1所示。

image.png 图1识别运算符和运算数的有限自动机

2.2词法分析程序和语法分析程序的接口方式

      将语法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。词法分析程序每得到一次调用,便从源文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。

LR(1)文法

2.3递归下降LL(1)分析程序

2.3.1工作原理

每个非终结符都对应一个子程序。该子程序的行为根据语法描述来明确:根据下一个输入符号来确定按照哪一个产生式进行处理,再根据该产生式的右端,每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理每遇到一个非终结符,则调用相应的子程序

2.3.2分析程序设计

沿语法分析图箭头所指方向进行如下工作: 遇到一个语法单元,调用相应的子程序 遇到一个词法单位,则判断当前读入的单词 是否与该词法单位相匹配,若匹配,再读取 下一个单词继续分析;若不匹配,则进行出错处理