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

制作一个简单的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.mzph.cn/news/161127.shtml

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

相关文章

国民新旅游时代,OTA们如何制胜新周期?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 图霖 消费全面复苏的大背景下&#xff0c;旅游业正迎来预期中的拐点。 一个显著表现是&#xff0c;旅游消费正在从可选消费转化成必选消费。 国内消费者旅游需求的不降反增&#xff0c;就是最好的印证。 同程研究…

DoFaker: 一个简单易用的换脸工具

DoFaker: 一个简单易用的换脸工具 基于insightface开发&#xff0c;可以轻松替换视频或图片中的人脸。支持windows和linux系统&#xff0c;CPU和GPU推理。onnxruntime推理&#xff0c;无需pytorch。 更新 2023/9/16 更新动作迁移算法2023/9/14 更新脸部增强算法(GFPGAN)和超分…

TypeScript枚举

1、数字枚举 enum Direction {Up,Down,Left,Right, } var Direction; (function (Direction) {Direction[Direction["Up"] 0] "Up";Direction[Direction["Down"] 1] "Down";Direction[Direction["Left"] 2] "L…

[点云分割] 基于颜色的区域增长分割

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <thread> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/search.h> #include <pcl/search/kdtree.h> #inclu…

AR道具特效制作工具

AR&#xff08;增强现实&#xff09;技术已经逐渐渗透到各个行业&#xff0c;为企业带来了全新的营销方式和用户体验。在这个背景下&#xff0c;美摄科技凭借其强大的技术实力和创新精神&#xff0c;推出了一款专为企业打造的美摄AR特效制作工具&#xff0c;旨在帮助企业轻松实…

MIKE水动力笔记19_统计平均潮差

本文目录 前言Step 1 ArcGIS中创建渔网点Step 2 将dfsu数据提取到渔网点Step 3 Python统计平均潮差 前言 日平均潮差&#xff08;average daily tidal range&#xff09;&#xff1a;日高潮潮高合计之和除以实有高潮个数为日平均高潮潮高&#xff0c;日低潮潮高合计之和除以实…

Quartz .Net 的简单使用

参考了&#xff1a;c# .net framework 4.5.2 , Quartz.NET 3.0.7 - runliuv - 博客园 (cnblogs.com) https://www.cnblogs.com/personblog/p/11277527.html&#xff0c; Quartz.NET 作业调度&#xff08;一&#xff09;&#xff1a;Test - 简书 自己要轮询的任务&#xff1a…

NX二次开发UF_CAM_PREPRO_init_module 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREPRO_init_module Defined in: uf_cam_prepro.h int UF_CAM_PREPRO_init_module(void ) overview 概述 Initializes the required environment for this module. 初始化此…

浅谈Python装饰器原理与用法分析

前言 本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、装饰器的本质是函数&#xff0c;主要用来装饰其他函数&#xff0c;也就是为其他函数添加附加功能 2、装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装…

VScode调试没有反应

点击调试按钮后没反应 有可能是vscode中安装的python插件版本问题 可以通过重新安装比较旧一点的python尝试解决此问题 步骤如下&#xff1a; 然后从中选择比当前版本更低的版本即可 安装完成后需重启vscode

初识EasyAR

EasyAR 一、介绍&#xff08;核心还是 目标图像的屏占比&#xff09; 支持 EasyAR-AR|AR技术|AR SDK|Unity AR|下载 1.表面、图片(静止/运动)跟踪&#xff0c;支持多目标 2.3D物体(静止/运动)跟踪(注&#xff1a;物体旋转、远近移动也可以&#xff0c;本人试过&#xff0c;…

纵享双创盛宴 “之江创客”再创电商新辉煌

消费日报网讯&#xff08;记者 牛夏风&#xff09;营造良好电商双创生态&#xff0c;集聚电商发展新势能。10月31日&#xff0c;以“开放、连接、协同、赋能”为主题的“之江创客”2023全球电子商务创业创新大赛总决赛暨颁奖典礼在湖州南浔圆满落幕。 记者从现场获悉&#xff…

SQL 中的 MIN 和 MAX 以及常见函数详解及示例演示

SQL MIN() 和 MAX() 函数 SQL中的MIN()函数和MAX()函数用于查找所选列的最小值和最大值&#xff0c;分别。以下是它们的用法和示例&#xff1a; MIN() 函数 MIN()函数返回所选列的最小值。 示例&#xff1a; 查找Products表中的最低价格&#xff1a; SELECT MIN(Price) F…

js 获取当前窗口显示的放大比例

可以获取当前窗口显示的放大比例&#xff0c;也称为设备像素比 (devicepixelratio) 。这通常用于处理高DPI (高分辨率)屏幕上的视图缩放。您可以使用window.devicePixelRatio 属性来获得当前设备像素比。 以下是一个简单的JavaScript示例&#xff0c;演示如何获取设备像素比: j…

基于猕猴Spike运动解码的不同解码方法性能对比

公开数据集中文版详细描述 参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析 参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析 …

2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会

2023 年戴森设计大奖得主是谁&#xff1f;给大楼降温、争取救援机会 ​编辑拉风的极客2023/11/22 摘要 当今社会除了持续不断对科技创新保持注目&#xff0c;还有很多年轻发明家为了实际场景的难题提供解决方案。 11 月 15 日&#xff0c;2023 年戴森设计大奖国际大奖名单正…

Doris DDL和DML

1 创建用户和数据库 1)创建test用户 mysql -h hadoop1 -P 9030 -uroot -p create user test identified by test; 2)创建数据库 create database test_db; 3)用户授权

2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品生产单位安全生产管理人员证模拟考试题库及危险化学品生产单位安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供&#xff0c;危险化学品生产单位安全生产管理人员证模拟考试题库是根据危…

文件的原理和应用

常识: 1 文件包括属性和内容 2 文件有打开和未打开文件&#xff0c; 3 本文先讨论谁打开的文件&#xff0c;以及如何管理已经打开的文件 一 回忆c接口 1 fopen 我们在test.c里面用一下fopen函数&#xff0c;不存在打开的文件会默认创建&#xff0c;那为什么默认新建在当前…

【Kettle实战】字符串处理及网络请求JSON格式处理

经过大量的kettle操作实践&#xff0c;我们会渐渐掌握一些技巧&#xff0c;大大减轻清洗的工作量。比如在哪里 处理字符串更方便&#xff0c;在哪儿处理更合理都是一个取舍问题。 字符串拼接 MySQL中使用concat(字段1,字段2)&#xff0c;但是如果“字段2”为NULL&#xff0c;结…