编译原理 语法制导的翻译过程(L属性的翻译方案)实现带括号的整数加减乘除四则运算 JAVA实现

该实验旨在深入理解语义分析和LR分析表设计,要求基于文法实现带括号的整数加减乘除四则运算。通过L属性的翻译方案,当进行产生式归约时执行对应的语义动作。程序能够处理输入如5+3+8*2,输出24,以及10-6/2,输出7。错误输入如3++2会提示重新输入。实验提供了递归下降法和非递归预测分析法的程序基础,需要扩展支持减法和除法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

编译技术第6次上机内容

 

算术表达式的扩充

1. 实验目的

充分理解语义分析的方法及相关语义计算的执行时机。

掌握LR分析表的设计方法和语义加工程序的扩充。

2. 实验要求

参照算术表达式LR分析表的设计方法,设计扩充后的算术表达式LR分析表,并对原语义加工程序进行修改,加入新添加的内容。写一段程序,打印出计算结果E。

3. 实验内容

假设有以下文法:

L->En

E->E+T

E->E-T

E->T

T->T*F

T->T/F

T->F

F->(E)

F->id

设该文法进行自下而上计算时,打印出四则运算的计算结果。

E、T、F这些非终结符需要综合属性。以L属性的翻译方案为基础,将下表的语义规则嵌套在语法分析的过程中,即实现语法制导的翻译过程。

 

产  生  式 

语  义  规  则 

L®En

{print(E.val)}

E®E1+T

{ E.val=E1.val+T.val}

E®E1-T

{ E.val=E1.val-T.val}

E®T

{ E.val= T.val}

T®T1*F

{ T.val=T1.val*F.val}

T®T1/F

{ T.val=T1.val/F.val}

T®F

{ T.val= F.val}

F®(E)

{ F.val=E.val}

F®id

{ F.val=id.lexval}

 

 

 

2.以词法分析和语法分析部分的上机结果为基础,添加语义分析部分。即以LR文法为基础。当进行产生式归约时执行对应的语义动作。

 

3.输入:

5+3+8*2

输出:24

 

输入10-6/2

输出:7

 

 

4. 若输入有误,如:3++2

则应提示:重新输入!

 

5. 由于输入串是具体的数值,因此应调用相应的词法分析的功能。

 

扩展:

  1. 对浮点数和科学计数法的表示也能完成上述的操作。
  2. 增加减法和除法(也可继续扩展其他运算)对应的产生式,并能计算其语义结果。
  3. 在ftp中第五次上机的文件夹中有两个压缩包,用递归下降法实现的程序在压缩包“recursion_calculator.rar”中,用非递归的预测分析方法实现的程序在压缩包“predict_calculator.rar”中。可以任选其一作为基础进行改进,增加减法和除法的操作,写出改进后的文法,输出表达式的结果。
import java.util.Scanner;
import java.util.Stack;

//E->E+T	1
//E->E-T	2
//E->T		3
//T->T*F	4
//T->T/F	5
//T->F		6
//F->(E)	7
//F->id		8
public class Main {

	private static boolean guiyuefou = false;
	private static String Str = null; // 输入串
	private static String Sub = null;
	private static boolean acc = false;// 是否已处理完输入串
	private static boolean bResult
毕业论文引言 随着计算机技术的发展与普及,计算机已经成为各行业最基本的工具之一,迅速进入千家万户。因此,掌握计算机应用的基本技能成为新世纪人才不可缺少的基本素质之一。为使计算机能正常工作, 除了构成计算机各个组成部分的物理设备外, 一般说来, 还必须要有指挥计算机“做什么”“如何做”的“程序”。程序及其有关文档构成计算机软件, 其中用以书写计算机软件的语言称为计算机程序设计语言。 1 计算机程序设计语言简介 计算机程序设计语言是计算机可以识别的语言,用于描述解决问题的方,供计算机阅读执行,通常简称为编程语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。使用程序设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为所有的程序都需要程序设计语言才能完成,而计算机的工作是用程序来控制的,离开了程序,计算机将一事无成。 2 开发背景及意义 现有计算器不能计算表达式,这是一个缺陷,为此,开发了一个能直接计算表达式的计算器,这为计算提高了更大的方便,可以大幅度提高计算效率。 第二章 第三章 第一节 递归下降的描述 3.1.1实现思想 它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文递归相应子程序也递归,所以称这种方为递归子程序下降或递归下降。其中子程序的结构与产生式结构几乎是一致的。文中每个非终结符对应一个递归过程(子程序),每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式可唯一地确定选择某个候选式进行推导。 3.1.2算的特点 递归下降语法分析中最易懂的一种方。递归下降要满足的条件:假设A的全部产生式为Aα1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式 predict(Aαi)∩predict(Aαj)=Φ,当i≠j. 3.1.3构造递归下降语法分析程序 采用了递归子程序方进行语法分析,对文中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方,所以程序结构层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。 第二节
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值