计算机二级ms-office公式excel汇总题目(难题汇总)_第1页
计算机二级ms-office公式excel汇总题目(难题汇总)_第2页
计算机二级ms-office公式excel汇总题目(难题汇总)_第3页
计算机二级ms-office公式excel汇总题目(难题汇总)_第4页
计算机二级ms-office公式excel汇总题目(难题汇总)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二套3.在“产品销售汇总表”中,分别计算各型号产品的一、二季度销量、销售额及合计数,填入相应列中。所有销售额均设为数值型、小数位数0,使用千位分隔符,右对齐。步骤2:在C2单元格中插入公式“=SUMIF(一季度销售情况表!$B$2:$B$44,B2,一季度销售情况表!$D$2:$D$44)”,按Enter键,双击右下角的填充柄自动填充。第十三套2.利用“成绩单”、“小分统计”和“分值表”工作表中的数据,完成“按班级汇总”和“按学校汇总”工作表中相应空白列的数值计算。具体提示如下:“考试学生数”列必须利用公式计算, “平均分”列由“成绩单”工作表数据计算得出;“分值表”工作表中给出了本次考试

2、各题的类型及分值。(备注:本次考试一共50道小题,其中【1】至【40】为客观题,【41】至【50】为主观题);“小分统计”工作表中包含了各班级每一道小题的平均得分,通过其可计算出各班级的“客观题平均分”和“主观题平均分”。(备注:由于系统生成每题平均得分时已经进行了四舍五入操作,因此通过其计算“客观题平均分”和“主观题平均分”之和时,可能与根据“成绩单”工作表的计算结果存在一定误差);利用公式计算“按学校汇总”工作表中的“客观题平均分”和“主观题平均分”,计算方法为:每个学校的所有班级相应平均分乘以对应班级人数,相加后再除以该校的总考生数;计算“按学校汇总”工作表中的每题得分率,即:每个学校所

3、有学生在该题上的得分之和除以该校总考生数,再除以该题的分值。所有工作表中“考试学生数”、“最高分”、“最低分”显示为整数;各类平均分显示为数值格式,并保留2位小数;各题得分率显示为百分比数据格式,并保留2位小数。(2)【解题步骤】步骤1:切换至“按班级汇总”工作表中,选择C2单元格,在该单元格中输入“=COUNTIFS(成绩单!$A$2:$A$950,按班级汇总!$A2,成绩单!$B$2:$B$950,按班级汇总!$B2)”公式,按Enter键完成输入,双击右下角的填充柄填充数据。提示:多条件计数函数COUNTIFS(Criteria_range1,Criteria1,Criteria_ran

4、ge2,Criteria2)主要功能:统计指定单元格区域中符合多组条件的单元格的个数。参数说明:Criteria_range1必需的参数。第1组条件中指定的区域。Criteria1必需的参数。第1组条件中指定的条件,条件的形式可以为数字、表达式、单元格地址或文本。Criteria_Range2,Criteria2可选参数。第2组条件,还可以有其他多组条件。本题中公式表示统计同时满足以下条件的单元格的个数:成绩单工作表A2:A950区域中等于按班级汇总工作表A2单元格内容(即滨海市第一中学),并且成绩单工作表B2:B950区域中等于按班级汇总工作表B2单元格内容(即1班)。步骤2:在工作表中选择

5、D2单元格,在该单元格中输入公式“=MAX(成绩单!$A$2:$A$950=按班级汇总!$A2)*(成绩单!$B$2:$B$950=按班级汇总!$B2)*成绩单!$D$2:$D$950)”,按Ctrl+Shift+Enter组合键完成输入。提示:最大值函数MAX(number1,number2,)主要功能:返回一组值或指定区域中的最大值参数说明:参数至少有一个,且必须是数值,最多可以有255个。本题中:成绩单!$A$2:$A$950=按班级汇总!$A2返回值为逻辑值(True或False),成绩单!$B$2:$B$950=按班级汇总!$B2返回值也为逻辑值(True或False),将两个表达式

6、进行乘运算时,逻辑值True转换为1,逻辑值False转换为0参加运算。也即,同时满足两个条件时,MAX中的求值区域才为非0数,最终形成的表达式只有是MAX(1*1*成绩单!$D$2:$D$950),才会统计这个区域的最大值。当编辑完第一个公式后,此时注意,必须同时按下Ctrl+Shift+Enter组合键,才能显示出统计结果,之后就可以使用填充柄进行公式填充。步骤3:选择E2单元格,在该单元格中输入公式“=MIN(IF(成绩单!$A$2:$A$950=按班级汇总!$A2)*(成绩单!$B$2:$B$950=按班级汇总!$B2),成绩单!$D$2:$D$950)”,按Ctrl+Shift+En

7、ter组合键完成输入。提示:最小值函数MIN(number1,number2,)主要功能:返回一组值或指定区域中的最小值参数说明:参数至少有一个,且必须是数值,最多可以有255个逻辑判断函数IF(logical_test,value_if_true,value_if_false)主要功能:如果指定条件的计算结果为TRUE,IF函数将返回某个值;如果该条件的计算结果为FALSE,则返回另一个值。参数说明: logical_test必须的参数,作为判断条件的任意值或表达式 value_if_true可选的参数。Logical_test参数的计算结果为TRUE时所要返回的值 value_if_fal

8、se可选的参数。Logical_test参数的计算结果为FALSE时所要返回的值本题中:成绩单!$A$2:$A$950=按班级汇总!$A2返回值为逻辑值(True或False),成绩单!$B$2:$B$950=按班级汇总!$B2返回值也为逻辑值(True或False),将两个表达式进行乘运算时,逻辑值True转换为1,逻辑值False转换为0参加运算。也即,同时满足两个条件时,IF函数中的条件表达式为TRUE,才能返回表达式“成绩单!$D$2:$D$950”,此时使用MIN函数统计指定区域中的最小值步骤4:选择F2单元格,在该单元格中输入公式“=AVERAGEIFS(成绩单!$D$2:$D$9

9、50,成绩单!$A$2:$A$950,按班级汇总!$A2,成绩单!$B$2:$B$950,按班级汇总!$B2)”,按Enter键完成输入。提示:多条件平均值函数AVERAGEIFS(average_range,criteria_range1,criteria1,criteria_range2,criteria2,)主要功能:对指定区域中满足多个条件的所有单元格中的数值求算数平均值。参数说明: average_range必需的参数。要计算平均值的实际单元格区域 criteria_range1,criteria_range2在其中计算关联条件的区域 criteria1,criteria2求平均值的

10、条件 其中每个criteria_range的大小和形状必须与average_range相同本题中公式表示对成绩单D2:D950区域中符合以下条件的单元格的数值求平均值:成绩单工作表A2:A950区域中等于按班级汇总工作表A2单元格内容(即滨海市第一中学),并且成绩单工作表B2:B950区域中等于按班级汇总工作表B2单元格内容(即1班)。步骤5:选择G2单元格,在该单元格中输入公式“=SUM(小分统计!$C2:$AP2)”,按Enter键完成输入,双击右下角的填充柄填充数据。步骤6:选择H2单元格,在该单元格中输入公式“=SUM(小分统计!$AQ2:$AZ2)”,按Enter键完成输入,双击右下

11、角的填充柄填充数据。步骤7:选择C、D、E列,单击鼠标右键,在弹出的快捷菜单中选择【设置单元格格式】选项,在弹出的对话框中选择【分类】列表中选择【数值】选项,将【小数位数】设置为0,设置完成后,单击“确定”按钮即可。按同样的方式,将F、G、H列【小数位数】设置为2。步骤8:切换至“按学校汇总”工作表中,选择B2单元格,在该单元格中输入公式“=COUNTIF(成绩单!$A$2:$A$950,按学校汇总!$A2)”,按Enter键完成输入,双击右下角的填充柄填充数据。提示:条件计数函数COUNTIF(range,criteria)主要功能:统计指定区域中满足单个指定条件的单元格的个数参数说明: r

12、ange必需的参数。计数的单元格区域 criteria必需的参数。计数的条件,条件的形式可以为数字、表达式、单元格地址或文本本题中公式表示统计成绩单工作表A2:A950区域中,等于A2单元格内容(即滨海市第一中学)的单元格的个数。步骤9:选择C2单元格,在该单元格中输入“=MAX(成绩单!$A$2:$A$950=按学校汇总!$A2)*成绩单!$D$2:$D$950)”,按Ctrl+Shift+Enter键完成输入,双击右下角的填充柄填充数据。在D2单元格中输入“=MIN(IF(成绩单!$A$2:$A$950=按学校汇总!$A2,成绩单!$D$2:$D$950)”,按Ctrl+Shift+Ent

13、er键完成输入,双击右下角的填充柄填充数据。在E2单元格中输入“=AVERAGEIFS(成绩单!$D$2:$D$950,成绩单!$A$2:$A$950,按学校汇总!$A2)”,按Enter键完成输入,双击右下角的填充柄填充数据。步骤10:在F2单元格中输入“=SUM(按班级汇总!$A$2:$A$33=按学校汇总!$A2)*(按班级汇总!$C$2:$C$33)*(按班级汇总!$G$2:$G$33)/$B2”,按Ctrl+Shift+Enter键完成输入,双击右下角的填充柄填充数据。在G2单元格中输入“=SUM(按班级汇总!$A$2:$A$33=按学校汇总!$A2)*(按班级汇总!$C$2:$C$

14、33)*(按班级汇总!$H$2:$H$33)/$B2”,按Ctrl+Shift+Enter键完成输入,双击右下角的填充柄填充数据。提示:本题中按班级汇总!$A$2:$A$33=按学校汇总!$A2返回的值为逻辑值(TRUE和FALSE),参加运算时,TRUE转换为1,FALSE转换为0。即统计指定学校的学生,使用SUM函数将数组按班级汇总!$C$2:$C$33与数组按班级汇总!$G$2:$G$33对应位置的数据进行乘运算,然后求出乘积的和,最后将得到的总成绩与学生人数相除,求得平均分。步骤11:在H2单元格中输入“=SUM(小分统计!$A$2:$A$33=$A2)*小分统计!C$2:C$33*按

15、班级汇总!$C$2:$C$33)/$B2/分值表!B$3”,按Ctrl+Shift+Enter键完成输入,拖动填充柄,横向填充到BE2单元格,紧接着从BE2单元格,拖动填充句柄,纵向填充到BE5单元格。步骤12:选择B、C、D列,单击鼠标右键,在弹出的快捷菜单中选择【设置单元格格式】选项,在弹出的对话框中选择【分类】列表中选择【数值】选项,将【小数位数】设置为0,设置完成后,单击“确定”按钮。按同样的方式,将E、F、G列【小数位数】设置为2。步骤13:选择H列到BE列,单击鼠标右键,在弹出的快捷菜单中选择【设置单元格格式】选项,在弹出的对话框中选择【分类】列表中选择【百分比】选项,将【小数位数

16、】设置为2,设置完成后,单击“确定”按钮即可。第14套第15套2.在“停车收费记录”表中,涉及金额的单元格格式均设置为保留2位的数值类型。依据“收费标准”表,利用公式将收费标准对应的金额填入“停车收费记录”表中的“收费标准”列;利用出场日期、时间与进场日期、时间的关系,计算“停放时间”列,单元格格式为时间类型的“XX时XX分”。步骤4:计算停放时间,首先利用DATEDIF计算日期的差值,乘以24;再加上进场时间和出场时间的差值。即在J2单元格中输入“=DATEDIF(F2,H2,”YD”)*24+(I2-G2)”,按Enter,并向下拖动将数据进行填充。说明:DATEDIF(start_dat

17、e,end_date,unit),返回两个日期之间的年月日间隔数。Start_date为一个日期,它代表时间段内的第一个日期或起始日期。参数End_date为一个日期,它代表时间段内的最后一个日期或结束日期。参数Unit为所需信息的返回类型。当单位代码为”YD”时,计算结果是两个日期间隔的天数.忽略年数差。注:结束日期必须大于起始日期。3.依据停放时间和收费标准,计算当前收费金额并填入“收费金额”列;计算拟采用的收费政策的预计收费金额并填入“拟收费金额”列;计算拟调整后的收费与当前收费之间的差值并填入“差值”列。(3)【解题步骤】考点提示:本题主要考核公式和函数的使用。步骤1:计算收费金额,在

18、K2单元格中输入公式“=ROUNDUP(HOUR(J2)*60+MINUTE(J2)/15,0)*E2”,并向下自动填充单元格。步骤2:计算拟收费金额,在L2单元格中输入公式“=INT(HOUR(J2)*60+MINUTE(J2)/15)*E2”,并向下自动填充单元格。步骤3:计算差值,在M2单元格中输入公式“=K2-L2”,并向下自动填充单元格。说明:1.Roundup函数表示:向上舍入数字,跟四舍五入不一样,不管舍去的首位数字是否大于4,都向前进1。2.Roundup函数的语法格式=Roundup(number,num_digits)Number表示:用来向上舍入的数字。Num_digit

19、s舍入后的数字的小数位数(即保留几位小数)。3.当Roundup函数中参数num_digits大于0时,则表示向上舍入到指定的小数位(这里保留一位小数)。第17套3.课时费统计表中的F至I列中的空白内容必须采用公式的方式计算结果。根据教师基本信息工作表和课时费标准工作表计算职称和课时标准列内容,根据授课信息表和课程基本信息工作表计算学时数列内容,最后完成课时费列的计算。【提示:建议对授课信息表中的数据按姓名排序后增加学时数列,并通过VLOOKUP查询课程基本信息表获得相应的值。】(3)【解题步骤】步骤1:选择F3单元格,单击【公式】|【函数库】组中的“插入函数”按钮,弹出“插入函数”对话框,在

20、“选择函数”下拉列表中找到VLOOKUP函数,单击“确定”按钮,弹出“函数参数”对话框。步骤2:在第1个参数框中用鼠标选择“E3”;第2个参数框中选择“教师基本信息”工作表中的D3:E22区域;第3个参数框中输入“2”;第4个参数框中输入“FALSE”或者“0”;单击“确定”按钮即可。步骤3:本题也可直接在“课时费统计表”工作表的F3单元格中输入公式“=VLOOKUP(E3,教师基本信息!$D$3:$E$22,2,FALSE)”,按Enter键,双击F3单元格右下角的填充柄完成职称的自动填充。步骤4:同理,使用VLOOKUP函数计算“课时标准”。第1个参数框中用鼠标选择“G3”;第2个参数框中

21、选择“课时费标准”工作表中的A3:B6区域;第3个参数框中输入“2”;第4个参数框中输入“FALSE”或者“0”;单击“确定”按钮即可。步骤5:本题也可直接在“课时费统计表”工作表的G3单元格中输入公式“=VLOOKUP(F3,课时费标准!$A$3:$B$6,2,FALSE)”,按Enter键,双击G3单元格右下角的填充柄完成课时标准的自动填充。步骤6:根据题目提示,先在“授课信息表”中增加“学时数”列。在“授课信息表”的F2单元格输入“学时数”,回车选择“F3”,同理使用VLOOKUP函数计算“学时数”。第1个参数框中用鼠标选择“E3”;第2个参数框中选择“课程基本信息”工作表中的B3:C1

22、6区域;第3个参数框中输入“2”;第4个参数框中输入“FALSE”或者“0”;单击“确定”按钮,双击F3单元格右下角的填充柄完成学时数的自动填充。步骤7:根据题目提示,再计算“课时费统计表”中的“学时数”列。切换到“课时费统计表”工作表,选择H3单元格,单击【公式】|【函数库】组中的“插入函数”按钮,弹出“插入函数”对话框,在“选择函数”下拉列表中找到SUMIF函数,单击“确定”按钮,弹出“函数参数”对话框。步骤8:在第1个参数框中用鼠标选择“授课信息表”的“D3:D72”数据区域;第2个参数框中输入“E3”;第3个参数框中输入选择“授课信息表”的“F3:F72”数据区域;单击“确定”按钮,双

23、击H3单元格右下角的填充柄自动填充到最后一行。步骤9:在I3单元格中输入公式“=G3*H3”完成课时费的计算。第18套2.输入并填充公式:在余额列输入计算公式,余额=上期余额+本期借方-本期贷方,以自动填充方式生成其他公式。 3.方向列中只能有借、贷、平三种选择,首先用数据有效性控制该列的输入范围为借、贷、平三种中的一种,然后通过IF函数输入方向列内容,判断条件如下所列: 余额大于0等于0小于0 方向借平贷第20套4.学号第4、5位代表学生所在的班级,例如:C120101代表12级1班。请通过函数提取每个学生所在的专业并按下列对应关系填写在班级列中: 学号的4、5位对应班级 011班 022班

24、 033班第22套2.根据身份证号,请在员工档案表工作表的出生日期列中,使用MID函数提取员工生日,单元格式类型为yyyy年m月d日。3.根据入职时间,请在员工档案表工作表的工龄列中,使用TODAY函数和INT函数计算员工的工龄,工作满一年才计入工龄。4.引用工龄工资工作表中的数据来计算员工档案表工作表员工的工龄工资,在基础工资列中,计算每个人的基础工资。(基础工资=基本工资+工龄工资)新1套(4)在“按月统计”工作表中,利用公式计算1月6月的销售达标率,即销售额大于60000元的人数所占比例,并填写在“销售达标率”行中。要求以百分比格式显示计算数据,并保留2位小数。(5)在“按月统计”工作表

25、中,分别通过公式计算各月排名第1、第2和第3的销售业绩,并填写在“销售第一名业绩”、“销售第二名业绩”和“销售第三名业绩”所对应的单元格中。要求使用人民币会计专用数据格式,并保留2位小数。新2套(6)在“销售记录”工作表的F4:F891中,计算每笔订单记录的金额,并应用货币格式,保留零位小数,计算规则为:金额=价格数量(1-折扣百分比),折扣百分比由订单中的订货数量和产品类型决定,可以在“折扣表”工作表中进行查询,例如某个订单中产品A的订货量为1510,则折扣百分比为2%(提示:为便于计算,可对“折扣表”工作表中表格的结构进行调整)。“=D4*E4*(1-VLOOKUP(C4,折扣表!$B$9

26、:$F$11,IF(D41000,2,IF(D41500,3,IF(D42000,4,5)”,错误版本上图新4套身份证号的倒数第2位用于判断性别,奇数为男性,偶数为女性;工龄工资的计算方法:本公司工龄达到或超过30年的每满一年每月增加50元、不足10年的每满一年每月增加20元、工龄不满1年的没有工龄工资,其他为每满一年每月增加30元。附录资料:不需要的可以自行删除C语言编译器的设计与实现 我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1

27、) 词法分析部分(2) 语法分析处理及四元式生成部分 (3) 输出显示部分一词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式: (单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#def

28、ine e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define becomes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函数说明 读取函数 readline( )、read

29、ch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” source.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从 source.dat 中读取下一行至输入缓冲区。扫描函数 scan( ) 扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。变量处理 find( )变量处理中首先把以字母开头的字母数字串存到 spelling 数组中,然后进行识别。识别过程是先

30、让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配( 变量匹配函数 find( ) ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量( 值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。数字识别 number( ) 数字识别将识别出的数字填入二元式结果缓存数组。显示函数 显示函数的功能在屏幕上输出词法分析的结果( 即二元式序列程序),同时给出二元式个数及源程序行数统计。二语法分析器设计 语法分析器的核心是三张 SLR

31、分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在处理 if 和 while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。1. 控制语句的 SLR 分析表1 设计过程如下: 将扩展文法GS S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SL用_CLOSURE方法构造LR(0)项目规范簇为:I0: S SS if e S else

32、 SS while e S S L S a ;I1: S SI2: S ife S else SI3: S while e SI4: S L L S L SL S if e S else SS while e S S L S a ; I5: S a; I6: S if e S else S S if e S else SS while e S S L S a ; I7: S while e S S if e S else SS while e S S L S a ; I8: S L I9: L S L SL L SL L S S if e S else SS while e S S L S a

33、 ; I10: S a ; I11: S if e S else SI12: S while e S I13: S L I14: S SL I15: S if e S else S S if e S else SS while e S S L S a ; I16: S if e S else S 构造文法G中非终结符的FOLLOW集如下:FOLLOW(S) = # S if e S else S得FOLLOW(S) = else S L 得FOLLOW(L) = 3) S S 得FOLLOW(S) = else , # L S 因为FIRST(S) = ,所以FOLLOW(S) = else

34、, #, 在()项目规范簇中,只有9有“移进归约”冲突,L SL SL因为FOLLOW(L) FIRST(L) = 所以可以用方法解决以上冲突,最后我们得到的分析表如下:ACTIONGOTO ifElsewhilea;e#SL0S2S3S4S511ACC2S63S74S2S3S4S5985S106S2S3S4S5117S2S3S4S5128S139S2S3S4R5S591410R4R4R4111512R2R2R213R3R3R314R615S2S3S4S51616R1R1R1static int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1

35、, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1,/* 3 */ -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -

36、1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9 */ 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/

37、* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 15*/ 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列为 action 值,后 2 列为 goto 值;016 表示 17 个移进状态( 即 Si);-1表示出错;ACC 表示分析成功;而 100106 对应 7 个归约产生式:S SS i

38、f e S else SS while e SS L S a;L SL SL2. 算术表达式的 LR 分析表 2 设计如下:S EE E+EE E*EE (E)E i (过程略)ACTIONGOTOI+*()#E0S3S211S4S5ACC2S3S263R4R4R4R44S3S275S3S286S4S5S97R1R5R1R18R2R2R2R29R3R3R3R3static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,

39、/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,103,103, -1;3.布尔表达式的 SLR 分析表3 设计如下:(过程略)S BB iB i rop iB ( B )B ! BA B &B ABO

40、 B |B OBACTIONGOTOiRop()!&|#BAO0S1S4S513781S2R1R1R1R12S33R2R2R2R24S1S4S511785S1S4S56786R4S9S10R47S1S4S514788S1S4S515789R5R5R510R7R7R711S12S9S1012R3R3R3R313S9S10ACC14R6S9S10R615R8S9S10R8static int action21611=/* 0 */ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8,/* 1 */ 1, 2, -1,101, -1,101,101,101, -1, -1,

41、-1,/* 2 */ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 3 */ -1, -1, -1,102, -1,102,102,102, -1, -1, -1,/* 4 */ 1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8,/* 5 */ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8,/* 6 */ -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1,/* 7 */ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8,/* 8 */ 1

42、, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8,/* 9 */ 105, -1,105, -1,105, -1, -1, -1, -1, -1, -1,/*10 */ 107, -1,107, -1,107, -1, -1, -1, -1, -1, -1,/*11 */ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1,/*12 */ -1, -1, -1,103, -1,103,103,103, -1, -1, -1,/*13 */ -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1,/*14 */

43、-1, -1, -1,106, -1, 9, 10,106, -1, -1, -1,/*15 */ -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1;LR 分析表控制语义加工的实现:当扫描 LR 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。现在对 LR 分析器的分析栈加以扩充,使得每个文法符号之后都跟着它的语义值。为了清晰起见,我们把这个栈的每一项看成由三部分组成:状态 state ,文法符号 syl 和语义值 val。编译程序实现算术表达式、布尔表达式及程序语句的语义加工时,都是按这种状态

44、栈加工方式进行的。例如:( 5 + 3 ) * 6的分析过程序号STATEValsylinput10-#( 5 + 3 ) * 6 #202-#(5 + 3 ) * 6 #3023-#(5+ 3 ) * 6 #4026-5#(E+ 3 ) * 6 #50264-5-#(E+3 ) * 6 #602643-5-#(E+3 ) * 6 #702647-5-3#(E+E) * 6 #8026-8#(E) * 6 #90269-8-#(E)* 6 #1001-8#E* 6 #11015-8-#E* 6 #120153-8-#E*6#130158-8-6#E*E#1401-48#E#15ACC在分析过程

45、中,第(3)步操作后的状态栈为 023,根据栈顶状态“ 3”和现行输入符号“ +”( input 栏字符串的第一个字符)查分析表 ACTION3,+=R4,即按第(4)个产生式 En 来进行归约;由于产生式右部仅含一项,故去掉状态栈栈顶“3”;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第( 4)步的状态。第( 7)步操作后也是如此,当前状态栈为 02647,根据栈顶状态 7 和现行输入符号“ )”查分析表 ACTION7,)=R1,即按第(1)个产生式 EE1+E2进行归约;由于产生式右部有三项,故去掉状态栈栈顶

46、的 647 三项;此时 2 变为新的栈顶状态,再查( 2,E)的下一状态 s:GOTO2,E=6,即将状态 6 和文法符号 E 压栈,最后得到第(8)步的状态。三中间代码生成器设计:布尔表达式 布尔表达式在程序语言中有两个基本作用:一是用作控制语句( 如 if -else 或 while语句)的条件式;二是用于逻辑演算,计算逻辑值。布尔表达式是由布尔算符( &、| 、!)作用于布尔变量( 或常数)或关系表达式而形成的。关系表达式的形式是 E1 rop E2,其中 rop 是关系符( 如或),E1和 E2是算术式。在这里,我们只考虑前面给定文法所产生的布尔表达式:BB &B | B | B |

47、! B | (B) | i rop i | i遵照我们的约定,布尔算符的优先顺序( 从高到低)为:!、&、|,并假定&和|都服从左结合规则。所有关系符的优先级都是相同的,而且高于任何布尔算符,低于任何算术算符,关系算符不得结合。表达式的真、假出口的确定:考虑表达式 B1 | B2 ,若 B1为真,则立即知道 B 也为真;因此,B1的真出口也就是整个 B 的真出口。若 B1?为假,则 B2必须被计值,B2的第一个四元式就是 B1的假出口。当然,B2的真、假出口也就是整个 B的真、假出口。类似的考虑适用于对 B1 & B2的翻译,我们将 B1 | B2和 B1 & B2 的翻译用下图表示,在自下而

48、上的分析过程中,一个布尔式的真假出口往往不能在产生四元式的同时就填上。我们只好把这种未完成的四元式的地址( 编号)作为 B 的语义值暂存起来,待到整个表达式的四元式产生完毕之后再来回填这个未填入的转移目标。条件语句对条件语句 if e S1 else S2 中的布尔表达式 e,其作用仅在于控制对 S1和 S2的选择。因此,作为转移条件的布尔式e,我们可以赋予它两种“ 出口”:一是“ 真”出T口,出向 S1;一是“ 假”出口,出向 S2。于是,e的代码F条件语句可以翻译成如图的一般形式。非终结符 e 具有两项语义值 e _TC 和e_FC,它们分别指出了尚待回填真、S2的代码假出口的四元式串。e

49、 的“ 真”出口只有在往回扫描到if时才能知道,而它图 3-2 条件语句的代码结构 的“ 假”出口则需到处理过 S1并且到达 else 才能明确。这就是说,必须把 e_FC 的值传下去,以便到达相应的 else时才进行回填。另外,当 S1语句执行完时意味着整个 if-else 语句也已执行完毕;因此,在 S1的编码之后应产生一条无条件转移指令。这条转移指令将导致程序控制离开整个 if-else 语句。但是,在完成 S2的翻译之前,这条无条件转移指令的转移目标是不知道的。甚至,在翻译完 S2之后,这条转移指令的转移目标仍无法确定。这种情形是由于语句的嵌套性所引起的。例如下面的语句:if e1 i

50、f e2 S1 else S2 else S3 在 S1的代码之后的那条无条件转移指令不仅应跨越 S2而且应跨越 S3。这也就是说,转移目标的确定和语句所处的环境密切相关。条件循环语句条件循环语句 while e S 通常被翻译成图的代码结构。布尔式 e 的“ 真”出口出向 S 代码段的第一个四元式。紧接 S 代码段之后应产生一条转向测试 e 的无条件转移指令。e 的“ 假”出口将导致程序控制离开整个 while 语句。e 的“ 假”出口目标即使在整个 while 语句翻译完之后也未必明确。例如: if e1 while e2 S1 else S2这种情况仍是由于语句的嵌套性引起的。所以,我们

51、只好把它作为语句的语义值 SCHAIN 暂留下来,以便在处理外层语句时再伺机回填。语法翻译实现方法 将上述语法翻译付诸实现过程中,我们仅保留了算术表达式和布尔表达式翻译的文法和语义动作;面对程序语句的翻译,由于改造后含有较多的非终结符且语义动作又相对简单,故仍恢复为改造之前的程序语句文法。由于总体上构造一个 SLR 分析表来实现语法分析及语义加工将使得所构造的 SLR 分析表过大,所以将其分为下面三部分处理:对算术表达式单独处理,即为算术表达式构造一个 SLR 分析表,并将赋值语句A=E 与算术表达式归为一类处理,处理之后的赋值语句仅看作为程序语句文法中的一个终结符 a。对布尔表达式也单独处理

52、,并为其构造一个 SLR 分析表,经 SLR 分析表处理后的布尔表达式看作为程序语句文法中的一个终结符 e。程序语句文法此时变为:S if e S else S | while e S | L | a;L SL | S此时为程序语句构造相应的 SLR 分析表就简单多了。前面的程序语句文法中所添加的非终结符是为了能及时回填有关四元式转移目标而引入的,在取消了这些非终结符后又如何解决及时回填转移目标的问题呢?我们采取的解决方法是增加两个数组 labelmark 和 labeltemp 来分别记录语句嵌套中每一层布尔表达式( 如果有的话)e 的首地址以及每一层else( 如果有的话)之前的四元式地址( 即无条件转出此层 if 语句的四元式)。也即,对程序语句的翻译来说:在处理完布尔表达式 e 后,回填 if 或 while 语句的真值链;在归约完每一个语句 S 之后检查符号栈,看在 S 之前的文法符号是否 if 或 while,若是则回填假值链( 假值入口为语句 S 所对应的四元式序列之后;对 if 语句,此时已在该序列之后加入了一条无条件转移的四元式);在 if 语句中,else 前面要加入一个无条件转移的四元式转向 if 语句末尾;在 while语句尾要有一个无

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论