编译原理——将代码翻译成四元式序列

四元式的定义

四元式的一般形式为(op, arg1, arg2, result),其中:

  • op为一个二元(也可以是零元或一元)运算符
  • arg1arg2为两个运算对象,可以是变量、常数或者系统定义的临时变量名
  • result为运算结果。

在中间代码生成阶段中,我们需要对源代码生成一个四元式序列。

其中,op可以为数学运算符(+-*/%=等),例如:
a = b + c的四元式为(+, b, c, a)

也可以是布尔运算符(jjnzjezjrop),例如:
(j, _, _, p)表示无条件跳转第p个四元式
(jnz, A, _, p)表示若A为真则跳转到第p个四元式
(jez, A, _, p)表示若A为假则跳转到第p个四元式
(jrop, A, B, p)表示若A rop B为真则跳转到第p个四元式

实例
实例1:将下列的IF语句翻译成四元式序列
if A and B and (C > D)
then
	if A < B then F := 1
	else F := 0
else G := G + 1

首先将上述语句转换为流程图:
在这里插入图片描述

红色的数字表示该逻辑对应的地址,最终得出每个地址的四元式序列为:

  1. (jnz, A, _, 3),含义为当A为真时跳转到地址3。
  2. (j, _, _, 13),其含义为A为假时跳转到地址13。
  3. (jnz, B, _, 5),含义为当B为真时跳转到地址5。
  4. (j, _, _, 13),其含义为B为假时跳转到地址13。
  5. (j>, C, D, 7),含义为当C>D为真时跳转到地址7。
  6. (j, _, _, 13),其含义为B为假时跳转到地址13。
  7. (j<, A, B, 9)
  8. (j, _, _, 11)
  9. (:=, 1, _, F)F:=1的四元式
  10. (j, _, _, 15)
  11. (:=, 0, _, F)F:=0的四元式
  12. (j, _, _, 15)
  13. (+, G, 1, G)(:=, T, _, G),其含义为G:=G+1的四元式,因为该语句分为了两步:第一步计算G + 1,第二步将第一步计算的结果赋给G,所以有两个四元式。
实例2:将下列的FOR语句翻译成四元式序列
for i := a + b * 2 to c + d + 10 do
	if h > g then p := p + 1

将上述语句转换为流程图:
在这里插入图片描述
四元式序列:

  1. (*, b, 2, t1),先将2 * b的结果赋给t1
  2. (+, a, t1, t2),将t1 + a的结果赋给t2
  3. (+, c, d, t3),将c + d的结果赋给t3
  4. (+, t3, 10, t4),将t3 + 10的结果赋给t4
  5. (:=, t2, _, i),将t2赋给i
  6. (:=, t4, _, t),将t4赋给t
  7. (j, _, _, 10),跳转到10;
  8. (+, i, 1, t5),将i + 1结果赋给t5
  9. (:=, t5, _, i),将t5的值赋给i
  10. (j<=, i, t, 11)i <= t为真时跳转到11;
  11. (j>, h, g, 13)h > g时跳转到13;
  12. (j, _, _, 8),直接跳转到8;
  13. (+, p, 1, t6),将p + 1的值赋给t6
  14. (:=, t6, _, p),将t6的值赋给p
  15. (j, _, _, 8),直接跳转到8。
  • 68
    点赞
  • 435
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
编译原理是计算机科学中的一个重要分支,主要研究如何将高级语言转换为机器语言的过程。其中,词法分析器是编译器中的一个重要组成部分,它负责将源代码中的字符序列转换为有意义的单词序列,也就是词法单元。 下面是一个简单的词法分析器的C语言代码示例: ```c #include <stdio.h> #include <ctype.h> #include <string.h> #define MAX_TOKEN_LEN 100 typedef enum { INT, FLOAT, IDENTIFIER, KEYWORD } TokenType; typedef struct { TokenType type; char value[MAX_TOKEN_LEN]; } Token; char *keywords[] = {"if", "else", "while", "for", "int", "float"}; int is_keyword(char *word) { int i; for (i = 0; i < 6; i++) { if (strcmp(word, keywords[i]) == 0) { return 1; } } return 0; } Token get_token() { Token token; char c = getchar(); while (isspace(c)) { c = getchar(); } if (isdigit(c)) { token.type = INT; int i = 0; while (isdigit(c)) { token.value[i++] = c; c = getchar(); } if (c == '.') { token.type = FLOAT; token.value[i++] = c; c = getchar(); while (isdigit(c)) { token.value[i++] = c; c = getchar(); } } token.value[i] = '\0'; ungetc(c, stdin); } else if (isalpha(c) || c == '_') { token.type = IDENTIFIER; int i = 0; while (isalnum(c) || c == '_') { token.value[i++] = c; c = getchar(); } token.value[i] = '\0'; ungetc(c, stdin); if (is_keyword(token.value)) { token.type = KEYWORD; } } else { token.type = c; } return token; } int main() { Token token; do { token = get_token(); switch (token.type) { case INT: printf("INT: %s\n", token.value); break; case FLOAT: printf("FLOAT: %s\n", token.value); break; case IDENTIFIER: printf("IDENTIFIER: %s\n", token.value); break; case KEYWORD: printf("KEYWORD: %s\n", token.value); break; default: printf("%c\n", token.type); break; } } while (token.type != EOF); return 0; } ``` 这个词法分析器可以识别整数、浮点数、标识符和关键字。它通过一个`get_token()`函数来获取下一个词法单元,并根据单元的类型进行相应的处理。在`get_token()`函数中,它会读取输入流中的字符,根据字符的类型来判断当前单元的类型,并将单元的值存储在一个`Token`结构体中返回。在`main()`函数中,它会不断调用`get_token()`函数来获取下一个单元,并根据单元的类型进行相应的输出,直到读取到输入流的结尾。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值