算符优先语法分析程序设计与实现

制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读378次。C语言的程序中,有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表,给出对应的识别码,然后跟据对应的表格来写出程序。_用c语言编写词法分析程序https://blog.csdn.net/lijj0304/article/details/134078944前置程序词法分析器参考这个帖子⬆️

1.程序目标

算符优先语法分析程序,程序可以识别实验1的输出文件中的二元序列,然后通过已经构造好的优先关系矩阵,分析算式是否是正确的,并且能够返回错误的位置。算式的语法如下:

G[E]:EE+TE-TT

         TT*FT/FF

         F(E)i

2.程序设计

算符优先部分是通过构造一个二维数组实现,数组中存储了关系矩阵相关的信息。-1表示移进操作,1表示规约操作,0表示先移进后规约。矩阵当中的2表示算符优先矩阵中不存在这个两者关系,程序识别到这个位置时应当返回错误。程序中还用到了栈的数据结构来辅助运算。其中移进时需要实现入栈操作,而规约时需要实现出栈操作,且最后栈为空时则是识别成功。

3.算符优先分析

1. 首先我根据给定的语法,计算处所需要用到的firstvt集和lastvt集

firstvt(E) = {+, -, *, /, (, i}

firstvt(T) = {*, /, (, i}

firstvt(F) = {(, i}

lastvt(E) = {+, -, *, /, }, i}

lastvt(T) = {*, /, ), i}

lastvt(F) = {), i}

2. 接着可以计算出这个语法的算符优先表

+

-

*

/

(

)

i

#

+

>

>

<

<

<

>

<

>

-

>

>

<

<

<

>

<

>

*

>

>

>

>

<

>

<

>

/

>

>

>

>

<

>

<

>

(

<

<

<

<

<

=

<

)

>

>

>

>

>

>

i

>

>

>

>

>

>

#

<

<

<

<

<

<

=

3. 再得到关系矩阵

+

-

*

/

(

)

i

#

+

1

1

-1

-1

-1

1

-1

1

-

1

1

-1

-1

-1

1

-1

1

*

1

1

1

1

-1

1

-1

1

/

1

1

1

1

-1

1

-1

1

(

-1

-1

-1

-1

-1

0

-1

-2

)

1

1

1

1

-2

1

-2

1

i

1

1

1

1

-2

1

-2

1

#

-1

-1

-1

-1

-1

-2

-1

0

4.完整程序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_LEN 1000
char str[MAX_LEN];
char stack[MAX_LEN];
int top = 0;

                    //+, -, *, /, (, ), i, #
int table[8][8] =  {{ 1, 1,-1,-1,-1, 1,-1, 1}, // +
                    { 1, 1,-1,-1,-1, 1,-1, 1}, // -
                    { 1, 1, 1, 1,-1, 1,-1, 1}, // *
                    { 1, 1, 1, 1,-1, 1,-1, 1}, // /
                    {-1,-1,-1,-1,-1, 0,-1,-2}, // (
                    { 1, 1, 1, 1,-2, 1,-2, 1}, // )
                    { 1, 1, 1, 1,-2, 1,-2, 1}, // i
                    {-1,-1,-1,-1,-1,-2,-1, 0}};// #

int getindex(char ch) {
    switch(ch) {
        case '+': return 0;
        case '-': return 1;
        case '*': return 2;
        case '/': return 3;
        case '(': return 4;
        case ')': return 5;
        case 'i': return 6;
        case '#': return 7;
        default: return -1;
    }
}

int OPG(char *str, char *stack) {
    int i = 0;
    while(i < strlen(str)) {
        if(top < 0) return 0;
        int x = getindex(stack[top]);
        int y = getindex(str[i]);
        if(x == -1 || y == -1) {
			return 0;
		}
        if(table[x][y] == -1) {
            stack[++top] = str[i];
            printf("%c -> ", str[i++]);
        }
        else if(table[x][y] == 1) {
            top--;
        }
        else if(table[x][y] == 0) {
            top--;
            printf("%c -> ", str[i++]);
        }
        else if(table[x][y] == -2) {
            return 0;
        }
    }
    if(top+1 == 0) return 1;
    else return 0;
}

int main() {
	for(int m = 5; m <= 8; m++) {
		printf("test%d:\n", m);
		char txt[] = "./lexical/analyze";
		char num[6];
		sprintf(num, "%d.txt", m);
		strcat(txt, num);
		FILE *fp = fopen(txt, "r");
		char buf[MAX_LEN] = "";
		char input[MAX_LEN] = "";
		fgets(buf, MAX_LEN, fp);
		int i = 0, j = 0;
		for(int k = 0; k < strlen(buf); k++) {
			if(buf[k] == '1' && buf[k+1] == ',') {
				str[i++] = 'i';
				k += 3;
				while(1) {
					if(buf[k] == ')' && buf[k+1] == ' ')
						break;
					input[j++] = buf[k++];
				}
				continue;
			}
			if(buf[k] == ',' && buf[k+1] == ' ') {
				k += 2;
				while(1) {
					if(buf[k] == ')' && buf[k+1] == ' ')
						break;
					str[i++] = buf[k];
					input[j++] = buf[k++];
				}
			}
		}
		printf("Input scentence: %s\n", input);
		str[i] = '#';
        printf("str: %s\n", str);
		fclose(fp);
		stack[0] = '#', top = 0;
		if(OPG(str, stack)) {
			printf("end\n");
			printf("Gramma legal: %s\n", str);
		}
		else {
			printf("error\n");
			printf("Gramma illegal\n");
		}
	}
    return 0;
}

5.测试程序

tets1:a+b/c-d*e/f

test2:(a+b+c)/d-e-f+(g+h/j)

test3:(a+b*c)/d)+e-f

test4:a*/c+d/(e*f)

程序1分析结果:

analyze1:

(1, a) (44, +) (1, b) (38, /) (1, c) (47, -) (1, d) (50, *) (1, e) (38, /) (1, f)

analyze2:

(16, () (1, a) (44, +) (1, b) (44, +) (1, c) (17, )) (38, /) (1, d) (47, -) (1, e) (47, -) (1, f) (44, +) (16, () (1, g) (44, +) (1, h) (38, /) (1, j) (17, ))

analyze3:

(16, () (1, a) (44, +) (1, b) (50, *) (1, c) (17, )) (38, /) (1, d) (17, )) (44, +) (1, e) (47, -) (1, f)

analyze4:

(1, a) (50, *) (38, /) (1, c) (44, +) (1, d) (38, /) (16, () (1, e) (50, *) (1, f) (17, ))

程序3运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++-详解智能指针

目录 ​编辑 一.什么是智能指针 1.RAII 2.智能智能指针 二.为什么需要智能指针 1.内存泄漏 a. 什么是内存泄漏&#xff0c;内存泄漏的危害 b.内存泄漏分类 c.如何检测内存泄漏 d.如何避免内存泄漏 总结一下: 2.为什么需要智能指针以及智能指针的原理 三.智能指针的使用 1.C…

Docker使用笔记

1.使用docker创建pytorch深度环境 1.1 创建docker环境 docker run -it --nameDCASE --gpus all --shm-size 64G pytorch/pytorch /bin/bash #这里可以根据需要将 pytorch/pytorch 镜像更改为自己需要的镜像&#xff0c;如果不知道自己主机含有哪几个镜像&#xff0c;可以使用…

Linux lshw命令(lshw指令)(List Hardware,获取底层硬件信息)(查询硬件信息)

文章目录 Linux lshw命令&#xff1a;一个全面的硬件信息查询工具介绍安装lshw使用lshwlshw的选项和参数lshw文档英文文档中文文档 命令示例lshw -c network -sanitize查看系统网络硬件信息&#xff0c;并移除敏感项&#xff08;显示为REMOVED&#xff09; lshw与其他命令的对比…

手搭手浅学状态管理VueX

https://vuex.vuejs.org/zh/guide/ 每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“store”基本上就是一个容器&#xff0c;它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同&#xff1a; Vuex 的状态存储是响应式的。当 Vu…

25、矩阵乘法的本质

本来一直在介绍卷积,为什么突然出现一个矩阵乘法呢? 因为如果我们将卷积运算拆开,其中最核心的部分便是一个矩阵乘法。所以,卷积算法可以看做是带滑窗的矩阵乘法。 这里的滑窗,就是卷积运算中所示意的动图那样,所以,我们把滑窗固定,不看卷积核滑动这个动作,那么就是…

二维码智慧门牌管理系统升级:地址审核管理方案

文章目录 前言一、智能化门牌管理系统二、地址审核管理方案 前言 在当今信息化社会&#xff0c;标准地址管理是确保数据准确性和运营顺畅的重要一环。为了更好地管理地址信息&#xff0c;二维码智慧门牌管理系统升级了一项新的地址审核管理方案&#xff0c;旨在提高地址管理的…

人工智能学习6(贝叶斯实现简单的评论情感分析)

编译工具PyCharm 文章目录 编译工具PyCharm 文本分析与表示实现方式&#xff1a;文本表示方法文本相似度计算LDA主题模型 朴素贝叶斯算法应用&#xff1a;评论情感分析&#xff0c;工具评论分析是好评还是差评获取数据加载停用词内容标准化&#xff08;将每一句话划分成一个个的…

ESP32 freeRTOS笔记 参数传递、任务优先级

一、四种参数传递方式 1.1 整数传递 使用 (void *) 任何类型传递参数&#xff0c;通过地址传递给任务。 #include <stdio.h> #include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h"void myTask(void *pvP…

简单了解HTTP报文及示例

简单了解HTTP报文及示例 HTTP报文请求报文响应报文通用首部字段Cache-ControlConnectionDate 请求首部字段AcceptAccept-CharsetAccept-EncodingAccept-LanguageHostIf-MatchIf-Modified-SinceIf-None-MatchRefererUser-Agent 响应首部字段Accpet-RangesAgeLocationServer 实体…

8.HTTP工作原理

HTTP是什么 HTTP工作原理 HTTP协议的请求类型和响应状态码 总结 1.HTTP是什么 HTTP超文本传输协议就是在一个网络中上传下载文件的一套规则 2.HTTP工作原理 HTTP超文本传输协议的本质是TCP通信&#xff0c;链接—>请求—>响应—>断开 3.HTTP协议的请求类型和响应状…

stm32L071KB单片机字节对齐问题

字节对齐问题由来很关键 字节对齐问题由来 字节对齐问题由来 在移植同事代码的时候发现到一个赋值变量的地方就会出现死机&#xff0c;进入hardfault,怎么也找不不到原因&#xff0c;最后没办法去了github https://github.com/armink/CmBacktrace/blob/master/README_ZH.md Cm…

AWS攻略——使用中转网关(Transit Gateway)连接同区域(Region)VPC

文章目录 环境准备创建VPC 配置中转网关给每个VPC创建Transit Gateway专属挂载子网创建中转网关创建中转网关挂载修改VPC的路由 验证创建业务Private子网创建可被外网访问的环境测试子网连通性Public子网到Private子网Private子网到Private子网 知识点参考资料 在《AWS攻略——…

Hadoop的介绍与安装

1 Hadoop的简介 Hadoop是一个开源的大数据框架&#xff0c;是一个分布式计算的解决方案。Hadoop是由java语言编写的&#xff0c;在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架&#xff0c;其核心部件是HDFS与MapReduce。 HDFS是一个分布式文件系统&#x…

新华三数字大赛复赛知识点 AAA

AAA的概念和架构&#xff0c;RADIUS和TACASS的原理和配置 AAA是网络访问控制的一种安全管理框架&#xff0c;他决定哪些的用户能够访问网络&#xff0c;以及用户能够访问哪些资源或者得到哪些服务。 第一个A&#xff1a;认证 认证用来识别访问网络的用户的身份&#xff0c;判断…

Proteus仿真--基于1602LCD与DS18B20设计的温度报警器

本文介绍基于1602LCD与DS18B20设计的温度报警器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示1602LCD液晶显示器&#xff0c;报警模块选用蜂鸣器&#…

【电机控制】PMSM无感foc控制(五)相电流检测及重构 — 单电阻采样

0. 前言 相电流采样再FOC控制中是一个关键的环节&#xff0c;鉴于成本和易用性&#xff0c;目前应用较多的相电流采样方式是分流电阻采样&#xff0c;包括单电阻、双电阻以及三电阻采样法。 本章节先讲解单电阻采样相电流的检测及重构技术&#xff0c;在下一章讲解双电阻和三电…

linux 应用开发笔记---【标准I/O库/文件属性及目录】

一&#xff0c;什么是标准I/O库 标准c库当中用于文件I/O操作相关的一套库函数&#xff0c;实用标准I/O需要包含头文件 二&#xff0c;文件I/O和标准I/O之间的区别 1.标准I/O是库函数&#xff0c;而文件I/O是系统调用 2.标准I/O是对文件I/O的封装 3.标准I/O相对于文件I/O具有更…

spark sql基于RBO的优化

前言 这里只对RBO优化进行简单的讲解。讲解RBO之前必须对spark sql的执行计划做一个简单的介绍。 这个里讲解的不是很清楚&#xff0c;需要结合具体的执行计划来进行查看 1、执行计划 在spark sql的执行计划中&#xff0c;执行计划分为两大类&#xff0c;即逻辑执行计划、物…

基于Docker构建Python开发环境

1. Dockerfile dockerfile所在目录结构 FROM python:3.8 WORKDIR /leo RUN apt-get install -y wget RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai >/etc/timezone # ssh免密登录 COPY id_rsa.pub /leo RUN mkdir ~/.s…

【Unity动画】状态机中层的融合原理与用法详解

1. 状态机概念介绍 在Unity中&#xff0c;动画状态机&#xff08;Animator State Machine&#xff09;是一种强大的工具&#xff0c;用于控制游戏对象的动画行为。动画状态机由多个动画状态Animation和过渡条件Transition、层组成&#xff01;而层&#xff08;Layers&#xff…