当前位置: 首页 > ai >正文

递归下降 ll(1) 型文法 识别二元组文法分析

 

#include <stdio.h>
#include <string.h>FILE* fp;
FILE* fa2;char* str = new char[1200];				// 循环读取文件,分200字节读取char* peek;// 表格
typedef struct table {char* sign;char* kind;char* message;
} signtable;signtable* list;						// 数据表
int cnt=0;								// 当前读取表行
int cntv2=0;							// 递归下降时数据推进下一个// 匹配字符
int match(char p) {if(*peek==p) {peek++;return 1;} else {printf("%d\n",peek-str);return 0;}}int parseA() {if(*peek=='a') {match('a');return 1;
//		return match('a');} else {printf("发现错误\n");return 0;}
}
int parseB() {if(*peek=='c') {return match('c');} else if(*peek=='b') {return 1;}return 0;
}int parseS() {if(*peek=='a') {return parseA()&&match('a')&&parseS();} else if(*peek=='b'||*peek=='c') {return parseB()&&match('b')&&parseS();} else if(*peek=='d') {return match('d');}//	if(1) {					// 是目标字符串
//		return 1;
//	}return 0;					// 如果没有命中
}// 比较后进入下一个记号
int matchv2(char ch) {if(*peek==ch) {cntv2++;peek=&list[cntv2].sign[0];return 1;}return 0;
}// 一个声明,因为出现了循环调用
int parseE();int parseF() {if(*peek=='n') {matchv2('n');return 1;} else if(*peek=='l') {return matchv2('l')&&parseE()&&matchv2('r');}return 0;
}
// 待定
int parseT1() {if(*peek=='t') {matchv2('t');return parseF()&&parseT1();} else if(*peek=='d') {matchv2('d');return parseF()&&parseT1();} else {return 1;}}// E产生函数追加,顺藤摸瓜
int parseT() {return parseF()&&parseT1();
}// 待定
int parseE1() {if(*peek=='p'){matchv2('p');return parseT()&&parseE1();} else if(*peek=='s'){matchv2('s');return  parseT()&&parseE1();}else{return 1;}
//	return 0;
//	return 1;
}int parseE() {
//	if(*peek==''){return parseT()&&parseE1();
//	}
}// 初始化表格
void init() {list = new signtable[500];for(int i=0; i<500; i++) {list[i].kind = new char[30];list[i].message = new char[15];list[i].sign = new char[5];}}
// 表格写入数据
void split() {int pos=0;for(int k=0;; k++) {if(str[k]==',') {pos=k;break;}}int i=0;for(; i<pos; i++) {list[cnt].kind[i]=str[i];}list[cnt].kind[i]='\0';i=pos+1;for(; str[i]!='\0'; i++) {// 从 0 开始复制字符list[cnt].message[i-pos-1]=str[i];}list[cnt].message[i-pos-1]='\0';list[cnt].sign[0]=list[cnt].kind[0];list[cnt].sign[1]='\0';cnt++;}int main() {init();fp = fopen("input.txt", "r");fa2 = fopen("output.txt", "w");int check=0;//	分割词语
//	while (fgets(str, 200, fp) != NULL) {// 利用scanf 读取吸收回车,而希冀里不能执行   '\n'的比较while (fscanf(fp, "%s", str) != EOF) {// 处理回车,有些回车读取会影响代码结果if (str[0] == '\n' && strlen(str) == 0) {continue;} else if (str[strlen(str) - 1 ] == '\n') {					//			发现文末回车str[strlen(str) - 1 ] = '\0';}// 剥离成函数使用split();}for(int i=0; i<cnt; i++) {printf("%s\t%s\t%s\n",list[i].kind,list[i].message,list[i].sign);}peek = str;peek = &list[0].sign[0];//	check = parseS();check = parseE();// 像 parseS() 一样,直接->改match 系列, 然后数据再说// 直接面向类型进行递归下降//		fprintf(fa2,"%s\n",str);if(check==1) {fprintf(fa2,"true\n");printf("true\n");} else {fprintf(fa2,"false\n");printf("false\n");}fclose(fa2);fclose(fp);return 0;
}

http://www.xdnf.cn/news/364.html

相关文章:

  • libevent的bufferevent测试用例和使用方法(附带源码)
  • 筛选法(埃氏筛法)C++
  • 聊聊Doris的数据模型,如何用结构化设计解决实时分析难题
  • 【Linux我做主】make和makefile自动化构建
  • Python语法系列博客 · 第3期 数据结构入门(列表、元组、字典、集合)
  • LeetCode 239 滑动窗口最大值
  • 【深度学习—李宏毅教程笔记】Transformer
  • 探索 .bat 文件:自动化任务的利器
  • 关于数字信号与图像处理——基于Matlab的图像增强技术
  • 将软件架构风格定义为数据流风格,调用返回风格,独立构件风格,虚拟机风格和以数据为为中心这五种风格的依据是什么?请介绍这五种风格
  • 区块链木材业务服务平台:商贸物流新变革
  • 模态双侠闯江湖:SimTier 分层破局,MAKE 智炼新知
  • 不确定与非单调推理的可信度方法
  • 【C++算法】67.栈_基本计算器 II
  • IntelliJ IDEA右键快捷方式设置方法
  • 从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香
  • 8 编程笔记全攻略:Markdown 语法精讲、Typora 编辑器全指南(含安装激活、基础配置、快捷键详解、使用技巧)
  • VsCode搭建
  • Spring Boot + Caffeine:打造高性能缓存解决方案
  • 2.凸包优化求解
  • Viewer.js的使用方法
  • JDBC 数据库连接全解析:从驱动配置到工具类封装
  • yolov8的数据处理lableimg的安装以及使用
  • 黑马商城(五)微服务保护和分布式事务
  • 【Linux篇】探索进程间通信:如何使用匿名管道构建高效的进程池
  • PHP实现简单的爬虫功能
  • 不规则曲面上两点距离求取
  • Replicate Python client
  • 中间件--ClickHouse-12--案例-1-日志分析和监控
  • Datawhale AI春训营学习笔记