编译原理 算符优先分析程序设计 下载本文

内容发布更新时间 : 2024/11/2 16:28:49星期一 下面是文章的全部内容请认真阅读。

编译原理课程设计报告

评分: 签字:

编译原理课程设计二——算符优先分析程序设计

实验目的

了解掌握算符优先分析的基本方法、内容; 学会科学思考并解决问题,提高程序设计能力。

实验内容与要求

用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。

文法表示:

S→v=E|E?|clear E→E+T|E-T|T T→T*F|T/F|F F→ (E)|v|c 单词种别码设计:

= 1 ? 2 + 3 - 4 * 5 / 6 ( 7 ) 8 v 9 c 10 clear 11 # 12 N 13

实验环境

系统环境为windows系统,编译环境为VS2015,编程语言为C++。

实验过程

过程一:构建firstVT()和lastVT()

算法分析:

对于firstVT()构建,对于每个非终结符F的产生式,第一个终结符或者‘|’后的第一个终结符应该在其firstVT()集合内,且若非终结符T能推出非终结符F则firstVT(T)包含first(F)。 lastVT()的构造类似,对于每个非终结符F的产生式,非终结符后的第一个终结符都属于lastVT(F), 且若非终结符T能推出非终结符F则lastVT(T)包含first(F)。 算法实现主要函数:

void get_firstVT()//求firstVT(); void get_lastVT()//求lastVT();

结果:

FirstVT(S){=,?,l,+,-,*,/,(,v,c,} FirstVT(E){+,-,*,/,(,v,c,} FirstVT(T){*,/,(,v,c,} FirstVT(F){(,v,c,}

LastVT(S){=,?,l,+,-,*,/,),v,c,} LastVT(E){+,-,*,/,),v,c,} LastVT(T){*,/,),v,c,} LastVT(F){),v,c,}

过程二:构建优先符号表

算法分析:

(1)在产生式中两个相邻的终结符优先顺序相等 (2)对于小于关系,首先扫描终结符a标记flag=1,再扫描到非终结符Q,此时判断若flag=1,则对所有b∈FristVT{Q},a

(3)对于大于关系,首先扫描非终结符Q在前标记flag=1,再扫描终结符a在后此时判断若flag=1,对所有b∈LastVT{Q},b>a. 算法结果: = ? + - * / ( ) v c l #

其中-2表示不会出现,1表示>,-1表示<,0表示=. 字母l表示clear.

= -2 -2 -2 -2 -2 -2 -2 -2 0 -2 -2 -1 ? -2 -2 1 1 1 1 -2 1 1 1 -2 -1 + -1 -2 1 1 1 1 -1 1 1 1 -2 -1 - -1 -2 1 1 1 1 -1 1 1 1 -2 -1 * -1 -2 -1 -1 1 1 -1 1 1 1 -2 -1 / -1 -2 -1 -1 1 1 -1 1 1 1 -2 -1 ( -1 -2 -1 -1 -1 -1 -1 -2 -2 -2 -2 -1 ) -2 -2 1 1 1 1 0 1 1 1 -2 -1 v -1 -2 -1 -1 -1 -1 -1 -2 -2 -2 -2 -1 c -1 -2 -1 -1 -1 -1 -1 -2 -2 -2 -2 -1 l -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -1 # 1 1 1 1 1 1 1 1 1 1 1 0 过程三:词法分析

算法分析:详见课程设计一 算法主要函数:

int letter()//判断是否为字母 int digit()//判断是否为数字