扩展MicroC语言功能与编译器实现

14、为MicroC扩展for循环,例如允许使用“for (i = 0; i < 100; i = i + 1) sum = sum + i;”。为此,需要修改CLex.fsl和CPar.fsy中的词法分析器和解析器规范。可以通过在stmt类型中定义一个新的语句构造函数Forloop来扩展Absyn.fs中的MicroC抽象语法,并在解释器的exec函数中添加一个合适的情况。但实际上,一般形式的for循环“for (e1; e2; e3) stmt”等价于一个代码块“{ e1; while (e2) { stmt e3; } }”。因此,让解析器中的语义动作{ … }使用stmt类型中现有的Block、While和Expr构造函数来构造抽象语法就足够了。现有三个程序:(i) 编写含arrsum函数的程序,计算数组前n个元素的和;(ii) 编写含squares函数的程序,用i的平方填充数组;(iii) 编写含histogram函数的程序,计算数组中数字的频率。重写这三个程序,使用for循环代替while循环。

要为 MicroC 扩展 for 循环,按以下步骤操作:

  1. 修改 CLex.fsl CPar.fsy 中的词法分析器和解析器规范,以识别 for 循环语法。
  2. 可以选择在 Absyn.fs stmt 类型中定义新的语句构造函数 Forloop 来扩展抽象语法,并在解释器的 exec 函数里添加对应情况;
    不过推荐不引入特殊抽象语法,利用现有 Block While Expr 构造函数,因为
    for (e1; e2; e3) stmt 等价于
    { e1; while (e2) { stmt e3; } }
  3. 重写三个程序,用 for 循环替换 while 循环。这三个程序分别是:
    - (i) 编写含 arrsum 函数的程序,计算数组前 n 个元素的和;
    - (ii) 编写含 squares 函数的程序,用 i 的平方填充数组;
    - (iii) 编写含 histogram 函数的程序,计算数组中数字的频率。

15、在 Absyn.fs 文件中扩展微型 C 语言的抽象语法,加入 C、C++、Java 和 C# 中的前置自增和前置自减运算符。定义类型 expr 如下:type expr =… | PreInc of access(表示 C/C++/Java/C# 中的 ++i 或 ++a[e] )| PreDec of access(表示 C/C++/Java/C# 中的 –i 或 –a[e] )。前置自减和前置自增运算符作用于左值,也就是变量和数组元素,更一般地,作用于任何求值为一个位置的表达式。在 Interp.fs 文件中修改微型 C 语言解释器,使其能够处理 PreInc 和 PreDec 这两个新增的运算符。需要修改 eval 函数,并使用存储操作 getSto 和 setSto 来完成相应功能。

  • Absyn.fs 中扩展抽象语法,加入前置自增和前置自减运算符。
  • Interp.fs 中修改解释器以处理这两个运算符。
  • 具体需要修改 eval 函数。
  • 使用 getSto setSto 进行存储操作。

16、扩展微型C语言的词法分析器和语法分析器,使其能够接受 ++e 和 –e 表达式,并构建相应的抽象语法。

要解析包含 ++e --e 表达式的微型 C 源程序,需修改词法分析器和解析器。

同时注意,不能简单将 ++e 扩展为赋值表达式 e = e + 1 ,因为这会导致 e 被计算两次, e 本身可能有副作用,如 ++arr[++i] ,所以 e 应只计算一次。

抽象语法定义示例:

type expr = 
  ...
  | PreInc of access (* C/C++/Java/C# ++i or ++a[e] *)
  | PreDec of access (* C/C++/Java/C# --i or --a[e] *)

17、扩展微型C语言的词法分析器和语法分析器,以接受C/C++/Java/C#风格的条件表达式 e1 ? e2 : e3。条件表达式的抽象语法可以是 Cond(e1, e2, e3),为此你还需要修改 Absyn.fs 文件。

完成扩展可按以下步骤进行:

  1. 修改词法分析器(micro - C lexer):在词法分析器的规则中添加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值