1、编写一个正则表达式来描述标识符标记,该标记必须以字母开头,后面可以跟任意数量的字母、数字或下划线。
[a-zA-Z][a-zA-Z0-9_]*
2、在 Small 语言中添加 >=、<= 和 <>(不等于)运算符。提供所有文件中的必要部分,以便使用这些运算符的程序能够编译。编写一个 Small 程序来证明此功能有效。
要在 Small 语言中添加 >= 、 <= 和 <> 运算符,可按以下步骤操作:
- 在词法分析器(如
mlcomp.lex)中,为这些运算符添加对应的词法规则,将它们识别为独立的标记。 - 在语法分析器(如
mlcomp.grm)里,添加这些运算符的语法规则,并定义它们的优先级和结合性。 - 实现这些运算符的代码生成逻辑,确保编译器能正确处理包含这些运算符的表达式。
以下是一个示例 Small 程序,用于演示这些运算符的功能:
fun compare_numbers(x, y) =
if x >= y then "x 大于等于 y"
else if x <= y then "x 小于等于 y"
else if x <> y then "x 不等于 y"
else "无匹配情况";
val result = compare_numbers(5, 3);
print(result);
这个程序定义了一个比较两个数的函数,并调用该函数进行比较,最后打印比较结果。
3、为小型编译器添加对 if - then - else 表达式的支持,并使用 test4.sml 测试实现。
以下是将给定文本内容调整为 Markdown 格式 的结果(未添加任何额外描述,仅格式化):
AST 定义已在 mlast.sml 文件中,扫描器和解析器已能解析 if - then - else 表达式。
生成此 AST 的代码涉及一些与在代码生成器中添加一元否定所需的相同更改,可按这些步骤添加处理 if - then - else 表达式的必要代码。
- 尝试编译相关代码,编译器会报告代码缺失的位置。
- 编译
test4.sml,找出问题并修复。 - 重复此过程直至完成。
实现代码生成部分是添加支持的难点:
-
if - then - else表达式的 AST 有三个子表达式。 - 标识符的代码生成已完成。
- 生成
if - then - else表达式的代码需先为比较部分生成代码,再根据比较结果跳转。
代码生成器需要两个标签,可使用 mlcomp.sml 中的 nextLabel 函数获取。
4、为 andalso 和 orelse 运算符实现短路逻辑。
可按以下步骤实现:
- 在扫描器中为
andalso和orelse添加两个标记,二者均为关键字,应添加到mlcomp.lex扫描器规范的关键字部分。 - 将标记添加到
mlcomp.grm的语法规范中,并定义它们的优先级。两个运算符优先级相同,与加法处于同一级别,且均为左结合。 - 为语法添加两个产生式,以便解析表达式,产生式应返回 AST 节点。
Small语言编译器扩展与类型检查实现

最低0.47元/天 解锁文章
804

被折叠的 条评论
为什么被折叠?



