持续创作,加速成长!这是我参与「掘金日新计划 · 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集合定义
2.1.3 Follow集合定义
2.1.4 Select集合定义
2.1.5 LL(1)文法定义
本项目用到的DFA如下图1所示。
图1识别运算符和运算数的有限自动机
2.2词法分析程序和语法分析程序的接口方式
将语法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。词法分析程序每得到一次调用,便从源文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。
LR(1)文法
2.3递归下降LL(1)分析程序
2.3.1工作原理
每个非终结符都对应一个子程序。该子程序的行为根据语法描述来明确:根据下一个输入符号来确定按照哪一个产生式进行处理,再根据该产生式的右端,每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理每遇到一个非终结符,则调用相应的子程序
2.3.2分析程序设计
沿语法分析图箭头所指方向进行如下工作: 遇到一个语法单元,调用相应的子程序 遇到一个词法单位,则判断当前读入的单词 是否与该词法单位相匹配,若匹配,再读取 下一个单词继续分析;若不匹配,则进行出错处理