LL(1)语法分析程序设计与实现

news2024/9/19 8:13:06

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

前置程序词法分析器参考这个帖子⬆️

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

递归下降实现语法分析可以看这个⬆️

1.程序目标

制作一个LL(1)语法分析程序,程序可以识别词法分析器的输出文件中的二元序列,拼凑出用户输入。通过表驱动程序,实现赋值语句的LL(1)文法的LL(1)分析过程。算式的语法如下:

G[S]: S→V=E        E→TE′        E′→ATE|ε        T→FT′        T′→MFT′|ε        F→ (E)|i        A→+|-M→*|/        V→i

2.程序设计

我根据给定的语法,计算处所需要用到的first集和follow集,接着做select集,然后可以做出LL(1)分析表:

i

+

-

*

/

(

)

#

S

SV=E

E

ETE’

ETE’

E’

E’ATE’

E’ATE’

E’ ε

E’ ε

T

TFT’

TFT’

T’

T’ ε

T’ ε

T’MFT’

T’MFT’

T’ ε

T’ ε

F

Fi

F(E)

M

M*

M/

A

A+

A-

V

Vi

LL(1)的语法分析部分使用栈的思想来实现,定义了一个字符串的栈stack,LL1分析过程中产生的串存储在栈中,同时对于输入串有一个定位指针,栈顶元素和指针指向的字符比对,一样则栈顶元素出栈,指针往后移动。 

下面是程序LL(1)分析流程图

 

3.完整程序 

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

int LL1(char *str, char *stack) {
    int i = 0;
    while(str[i] != '#') {
		if(top < 0) return 0;
		if(stack[top] == str[i]) {
			printf("%c -> ", stack[top]);
			top--;
			i++;
		}
        else if(stack[top] == 'S') {
			if(str[i] == 'i') {
				stack[top++] = 'E';
				stack[top++] = '=';
				stack[top] = 'V';
			}
			else return 0;
		}
		else if(stack[top] == 'E') {
			if(str[i] == 'i') {
				stack[top++] = 'e';
				stack[top] = 'T';
			}
			else if(str[i] == '(') {
				stack[top++] = 'e';
				stack[top] = 'T';
			}
			else return 0;
		}
		else if(stack[top] == 'e') {
			if(str[i] == '+') {
				stack[top++] = 'e';
				stack[top++] = 'T';
				stack[top] = 'A';
			}
			else if(str[i] == '-') {
				stack[top++] = 'e';
				stack[top++] = 'T';
				stack[top] = 'A';
			}
			else if(str[i] == ')' || str[i] == '#') {
				printf("%c -> ", str[i]);
				top--;
			}
			else return 0;
		}
		else if(stack[top] == 'T') {
			if(str[i] == 'i') {
				stack[top++] = 't';
				stack[top] = 'F';
			}
			else if(str[i] == '(') {
				stack[top++] = 't';
				stack[top] = 'F';
			}
			else return 0;
		}
		else if(stack[top] == 't') {
			if(str[i] == '*') {
				stack[top++] = 't';
				stack[top++] = 'F';
				stack[top] = 'M';
			}
			else if(str[i] == '/') {
				stack[top++] = 't';
				stack[top++] = 'F';
				stack[top] = 'M';
			}
			else if(str[i] == '+' || str[i] == '-' || str[i] == ')' || str[i] == '#') {
				printf("%c -> ", str[i]);
				top--;
			}
			else return 0;
		}
		else if(stack[top] == 'F') {
			if(str[i] == 'i') 
				stack[top] = 'i';
			else if(str[i] == '(') {
				stack[top++] = ')';
				stack[top++] = 'E';
				stack[top] = '(';
			}
			else return 0;
		}
		else if(stack[top] == 'A') {
			if(str[i] == '+')
				stack[top] = '+';
			else if(str[i] == '-')
				stack[top] = '-';
			else return 0;
		}
		else if(stack[top] == 'M') {
			if(str[i] == '*')
				stack[top] = '*';
			else if(str[i] == '/')
				stack[top] = '/';
			else return 0;
		}
		else if(stack[top] == 'V') {
			if(str[i] == 'i') 
				stack[top] = 'i';
			else return 0;
		}
		else return 0;
    }
	return 1;
}

int main() {
	for(int m = 1; m <= 4; 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] = '#';
		fclose(fp);
		stack[0] = 'S', top = 0;
		int flag = LL1(str, stack);
		if(flag == 1) {
			printf("end\n");
			printf("Gramma legal: %s\n", str);
		}
		else {
			printf("error\n");
			printf("Gramma illegal\n");
		}
	}
    return 0;
}

 4.运行测试

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)

文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址 1、业务需求 目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表Ta…

社群乱象,社群玩法正解

社群乱象&#xff0c;社群玩法正解 越来越不喜欢混社群了&#xff0c;从原有的好几百社群&#xff0c;精简到剩两三个。就这两三个&#xff0c;也貌似奄奄一息&#xff0c;命不久矣的感觉。 现在的社群&#xff0c;妥妥的已经被各路妖魔鬼怪给玩坏了。童话觉得这里面还有不少…

vue3 iconify 图标几种使用 并加载本地 svg 图标

iconify iconify 与 iconify/vue 使用 下载 pnpm add iconify/vue -D使用 import { Icon } from "iconify/vue";<template><Icon icon"mdi-light:home" style"color: red; font-size: 43px" /><Icon icon"mdi:home-flo…

Spring Boot 邮件发送(五种类型的邮件)

邮件协议&#xff1a; SMTP、POP3、IMAP SMTP 协议全称为 Simple Mail Transfer Protocol&#xff0c;译作简单邮件传输协议&#xff0c;它定义了邮件客户端软件与 SMTP 服务器之间&#xff0c;以及 SMTP 服务器与 SMTP 服务器之间的通信规则。 用户先将邮件投递到腾讯的 SMT…

.nvmrc 文件使用详解

文章目录 1. 前言2. .nvmrc 是什么3. 创建 .nvmrc 文件4. 使用 .nvmrc 文件5. 终端自动切换版本 1. 前言 当开发多个项目时&#xff0c;每个项目运行环境要求的 node 版本不一样&#xff0c;那么我们就需要给每个项目指定 node 版本&#xff0c;也就是通过终端执行 nvm install…

虚拟摇杆OnJoystickMove未被调用,角色不移动

更改interaction type 为 event notification

Windows权限维持方法论

Windows权限维持方法论 1.注册表自启动2.组策略设置脚本启动3.计划任务4.服务自启动5.dll劫持6.直接上远程控制木马 1.注册表自启动 通过修改注册表自启动键值&#xff0c;添加一个木马程序路径&#xff0c;实现开机自启动 常用的注册表启动键&#xff1a; # Run键 HKEY_CU…

数据结构-栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

2023年中国语言大模型行业发展趋势分析:预计未来行业将迎来高速增长[图]

自然语言处理&#xff08;NLP&#xff09;大模型是一种利用深度学习技术来理解、解释和生成人类语言的高参数模型。语言大模型通过编码解码的方式模仿人类处理语言的过程从而达到进行自然语言文本输出的能力。 语言大模型主要组成部分 资料来源&#xff1a;共研产业咨询&#…

【grep】从html表格中快速定位某个数据

文章目录 1 背景2 参考知识2.1 grep2.2 HTML基础语言标签 3 解决方案 1 背景 在html中是一堆表格、图片、文字什么的&#xff0c;想从表格中提取关键词为“GJC”后对应的数字&#xff0c;怎么办呢&#xff1f; 逐个打开html文件&#xff0c;“ctrlF”搜一下&#xff0c;然后复…

数字化文旅系统,让景区营销变得更加简单!

随着互联网的普及和信息技术的不断发展&#xff0c;越来越多的消费者开始通过互联网来获取旅游信息、预订旅游产品和服务。因此&#xff0c;文旅行业需要紧跟时代步伐&#xff0c;借助数字化技术来提高服务质量和效率&#xff0c;满足消费者对于便捷、个性化的需求。 1. 强大功…

每日OJ题_算法_双指针_力扣202. 快乐数

力扣202. 快乐数 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为…

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制总结版(11.22)

1.任务需求 基于MS16F3211芯片实现功能一个按键通过长按可以控制当前处于亮状态的灯的亮度&#xff0c;当灯从最亮达到最暗时&#xff0c;所用时为3s。现有三盏颜色分别为红绿蓝的灯&#xff0c;在处于关机状态时红灯亮&#xff0c;处于开机状态时红灯灭。点按第一次仅绿灯亮&…

气膜体育馆:低碳环保体育新潮流

在追求健康生活的今天&#xff0c;体育运动的重要性无法忽视。为了满足人民日益增长的体育需求&#xff0c;气膜体育馆应运而生&#xff0c;成为体育场馆领域的一次革命性创新。这种新型体育馆解决了传统体育场馆建设中面临的审批难、周期长、门槛高等问题&#xff0c;为我们的…

网络安全之渗透测试入门准备

渗透测试入门所需知识 操作系统基础&#xff1a;Windows&#xff0c;Linux 网络基础&#xff1a;基础协议与简单原理 编程语言&#xff1a;PHP&#xff0c;python web安全基础 渗透测试入门 渗透测试学习&#xff1a; 1.工具环境准备&#xff1a;①VMware安装及使用&#xff1b…

在Jupyter Lab中使用多个环境,及魔法命令简介

一、Jupyter Lab使用conda虚拟环境 1、给虚拟环境添加 ipykernel 方法一: 创建环境时直接添加ipykernel 方法&#xff1a;conda create -n 【虚拟环境名称】python3.8 ipykernel实例如下&#xff1a; conda create -n tensorflow_cpu python3.8 ipykernel 方法二&#xff…

7-34 通讯录的录入与显示

方法1 import java.util.Scanner;class PTA34 {public static void main (String [] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();int nInteger.parseInt(s);addressbook[] aanew addressbook[n];for (int i 0; i < n; i) {String addressline sc…

动态规划:2304. 网格中的最小路径代价

2304. 网格中的最小路径代价 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中&#xff0c;从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) &#xff0c;且满足…

metersphere 创建场景, 自动动态变换参数值,实现接口自动化测试。

创建场景 创建产品变量 添加数值 添加后点击确定 点击右下角 号 点击 循环控制器 写循环 创建/导入接口 选择运行环境&#xff0c; 没有的话新建一个 需要点击引用环境 保存后点击 调试 成功做到每次请求的参数是列表里的 10

真菌基因组研究高分策略(一):比较基因组揭示真菌菌丝和多细胞的起源

真菌是陆地和水生生态系统的重要组分&#xff0c;在有机质循环和跨营养级养分流通等过程中发挥着重要作用。随着测序技术的发展&#xff0c;高通量测序揭示了真菌群落巨大的系统发育和功能多样性&#xff0c;高质量真菌基因组的组装已经成为研究菌丝和潜在基因的进化起源的有力…