采用算符优先分析法对表达式 (不包括括号运算)进行分析,并给出四元式序列。,c语言代码实现

时间: 2024-02-12 21:08:32 浏览: 35
假设我们要对表达式 `i + j * k - m` 进行算符优先分析,其优先级表如下: | | + | - | \* | / | i | j | k | m | $ | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | + | > | > | < | < | < | < | < | < | > | | - | > | > | < | < | < | < | < | < | > | | \* | > | > | > | > | < | < | < | < | > | | / | > | > | > | > | < | < | < | < | > | | i | < | < | < | < | - | - | - | - | > | | j | < | < | < | < | - | - | - | - | > | | k | < | < | < | < | - | - | - | - | > | | m | < | < | < | < | - | - | - | - | > | | $ | < | < | < | < | - | - | - | - | - | 其中 `>` 表示优先级高于,`<` 表示优先级低于,`-` 表示不可能出现的情况。 使用算符优先分析法可得四元式序列如下: ``` 1. t1 = j * k 2. t2 = i + t1 3. t3 = t2 - m ``` 下面是 C 语言实现算符优先分析法的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 50 // 运算符优先级表 char priority_table[9][9] = { {'>', '>', '<', '<', '<', '<', '<', '<', '>'}, {'>', '>', '<', '<', '<', '<', '<', '<', '>'}, {'>', '>', '>', '>', '<', '<', '<', '<', '>'}, {'>', '>', '>', '>', '<', '<', '<', '<', '>'}, {'<', '<', '<', '<', '-', '-', '-', '-', '>'}, {'<', '<', '<', '<', '-', '-', '-', '-', '>'}, {'<', '<', '<', '<', '-', '-', '-', '-', '>'}, {'<', '<', '<', '<', '-', '-', '-', '-', '>'}, {'<', '<', '<', '<', '<', '<', '<', '<', '-'} }; // 符号栈 char stack[MAX_SIZE]; int top = -1; // 操作数栈 char opd_stack[MAX_SIZE][MAX_SIZE]; int opd_top = -1; // 操作符栈 char opr_stack[MAX_SIZE]; int opr_top = -1; // 向符号栈中压入一个符号 void push(char c) { if (top == MAX_SIZE - 1) { printf("Stack overflow\n"); exit(1); } stack[++top] = c; } // 从符号栈中弹出一个符号 char pop() { if (top == -1) { printf("Stack underflow\n"); exit(1); } return stack[top--]; } // 向操作数栈中压入一个操作数 void push_opd(char *s) { if (opd_top == MAX_SIZE - 1) { printf("Operand stack overflow\n"); exit(1); } strcpy(opd_stack[++opd_top], s); } // 从操作数栈中弹出一个操作数 void pop_opd(char *s) { if (opd_top == -1) { printf("Operand stack underflow\n"); exit(1); } strcpy(s, opd_stack[opd_top--]); } // 向操作符栈中压入一个操作符 void push_opr(char c) { if (opr_top == MAX_SIZE - 1) { printf("Operator stack overflow\n"); exit(1); } opr_stack[++opr_top] = c; } // 从操作符栈中弹出一个操作符 char pop_opr() { if (opr_top == -1) { printf("Operator stack underflow\n"); exit(1); } return opr_stack[opr_top--]; } // 获取两个操作数和一个操作符,生成一个新的四元式 void gen(char *opd1, char *opd2, char opr, char *result) { static int count = 0; sprintf(result, "t%d", ++count); printf("%s = %s %c %s\n", result, opd1, opr, opd2); } // 从符号栈中扫描一个符号 char get_symbol() { if (top == -1) { return '$'; } return stack[top]; } // 判断两个运算符的优先级关系 char precede(char opr1, char opr2) { int i, j; switch (opr1) { case '+': i = 0; break; case '-': i = 1; break; case '*': i = 2; break; case '/': i = 3; break; case 'i': i = 4; break; case 'j': i = 5; break; case 'k': i = 6; break; case 'm': i = 7; break; case '$': i = 8; break; default: printf("Invalid operator %c\n", opr1); exit(1); } switch (opr2) { case '+': j = 0; break; case '-': j = 1; break; case '*': j = 2; break; case '/': j = 3; break; case 'i': j = 4; break; case 'j': j = 5; break; case 'k': j = 6; break; case 'm': j = 7; break; case '$': j = 8; break; default: printf("Invalid operator %c\n", opr2); exit(1); } return priority_table[i][j]; } // 对表达式进行算符优先分析 void analyze_expression(char *expr) { int i, j, len; char symbol, opr, opd1[MAX_SIZE], opd2[MAX_SIZE], result[MAX_SIZE]; len = strlen(expr); push('$'); for (i = 0; i < len; i++) { symbol = expr[i]; while (precede(get_symbol(), symbol) == '>') { opr = pop(); if (opr == '+' || opr == '-' || opr == '*' || opr == '/') { pop_opd(opd2); pop_opd(opd1); gen(opd1, opd2, opr, result); push_opd(result); } else if (opr == 'i' || opr == 'j' || opr == 'k' || opr == 'm') { push_opd(&opr); } } if (precede(get_symbol(), symbol) == '<') { push(symbol); } } while (get_symbol() != '$') { opr = pop(); if (opr == '+' || opr == '-' || opr == '*' || opr == '/') { pop_opd(opd2); pop_opd(opd1); gen(opd1, opd2, opr, result); push_opd(result); } } printf("%s\n", opd_stack[opd_top]); } int main() { char expr[] = "i+j*k-m"; analyze_expression(expr); return 0; } ``` 在该程序中,`push` 和 `pop` 分别用于操作符号栈,`push_opd` 和 `pop_opd` 分别用于操作数栈,`push_opr` 和 `pop_opr` 分别用于操作符栈。`precede` 函数用于判断两个运算符的优先级关系,`gen` 函数用于生成新的四元式。`analyze_expression` 函数实现算符优先分析算法,其实现步骤跟上面讲解的一致。

相关推荐

最新推荐

recommend-type

编译原理实验二——算符优先分析法设计与实现

用算符优先分析方法设计一个分析解释程序,对输入的赋值语句、输出语句、清除语句进行词法分析、语法分析、表达式求值并存储于指定变量中;若存在错误,提示错误相关信息。
recommend-type

采用算符优先分析法对表达式进行分析

1、 实验目的:采用算符优先分析法对表达式进行分析,掌握算符优先分析法的基本原理和实现过程。 2、 实验要求: 文法:无二义性的算术表达式的文法 (1)把词法分析作为语法分析的子程序实现(5分) (2)独立的...
recommend-type

基于算符优先分析方法的表达式语法分析器

基于算符优先分析方法的表达式语法分析器基于算符优先分析方法的表达式语法分析器基于算符优先分析方法的表达式语法分析器基于算符优先分析方法的表达式语法分析器
recommend-type

语法分析(算符优先).doc

简单易懂有注释,适合学习编译原理的初学者,并无难懂代码。 文档包含题目要求,源代码,操作方法,运行截图。 ⑴ 选择算符优先分析方法; ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流...
recommend-type

编译原理实验报告(词法语法分析 算符优先分析 有限自动机 LL(1)文法分析法等)

编程 词法分析编程实现 语法分析的编程实现 (C语言,C-free下编译) 算法 算符优先分析 确定的有限自动机 中间代码——a 建立链可用函数b 回填函数 LL(1)文法分析法
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。