递归子程序实现文法分析

需积分: 0 2 下载量 113 浏览量 更新于2024-09-16 收藏 64KB DOC 举报
"该文档是关于递归子程序在解析上下文无关文法中的应用,主要涉及一个简单的文法分析程序。程序通过递归子函数实现了对特定文法的解析,包括E、G、E1、T、S、F等非终结符的定义和解析规则。" 这篇文档介绍了一个基于C语言的文法分析器,用于处理一种简单的上下文无关文法。分析器采用递归子程序的方法来解析给定的输入字符串,并根据文法规则进行分析。以下是文档中各个部分的知识点详解: 1. 变量声明:`char a[50]`, `b[50]`, `d[200]`, `e[10]` 分别用于存储输入的句子、分析串、辅助分析过程的标记以及临时变量。其中,`a`数组存放用户输入的字符串,`b`数组用于保存分析过程中的当前字符。 2. 变量声明与初始化:`int n1`, `i1`, `flag`, `n` 分别用于追踪分析过程中的不同状态。例如,`n1`记录了输入字符串的长度,`flag`用于标记分析状态,`n`可能用于限制输入字符串的长度。 3. 函数声明:`int E()`, `int E1()`, `int T()`, `int G()`, `int S()`, `int F()` 分别对应文法中的非终结符及其解析规则。这些函数将在主函数`main()`中被调用,实现递归地解析输入的字符串。 4. 主函数`main()`:这是程序的入口点,负责获取用户输入、调用分析函数并输出分析结果。如果分析成功,程序将输出一个接受的标记和推导过程;如果分析失败,则输出错误信息。 5. 分析函数:每个分析函数如`E1()`,都对应文法中的一条规则。例如,`E1()`表示开始符号E,按照规则`E -> TG`进行解析。它们内部会调用其他分析函数,如`T()`和`G()`,形成递归结构。 6. 输入输出辅助函数:`input()` 和 `input1()` 用于显示分析串和剩余串,帮助理解分析过程。`output()` 可能用于输出最终的推导过程。 7. 文法规则: - (1) E -> TG:表明E可以由T和G组成。 - (2) G -> +TG | -TG:G可以是加号或减号前的TG。 - (3) G -> ε:G也可以为空。 - (4) T -> FS:T由F和S构成。 - (5) S -> *FS | /FS:S可以是乘号或除号前的FS。 - (6) S -> ε:S也可以为空。 - (7) F -> (E):F表示括号内的E。 - (8) F -> i:F还可以直接是一个数字'i'。 这个程序的核心是递归地应用这些文法规则,从输入的字符串开始,逐步分析并验证它是否符合文法。当分析成功时,程序会生成一个推导过程,展示如何通过文法规则将输入字符串转换为合法的表达式。如果分析失败,程序将输出错误信息。
2019-11-01 上传
实验3 进程的管理 一、实验内容 实验一  编写代码,实现以下功能:  打印当前所有环境变量的值;  添加新的环境变量NEWENV=first;  修改环境变量NEWENV的值为second;  打印环境变量NEWENV的值。 实验二  编写代码实现以下功能:  1.打印字符串“hello world!”  2.在打印字符串“hello world!”前调用三次fork,分析打印结果。 实验三  创建子进程  1.在子进程中打开文件file1,写入自己的“班级_姓名_学号”,  2.父进程读取file1中的内容,并且打印显示。  3.在父进程中获取已经结束的子进程的状态信息,打印该信息,并且打印结束的子进程的进程号。 实验四  编写程序实现以下功能:  1,在父进程中定义变量n,在子进程中对变量n进行++操作;并且打印变量n的值,打印子进程pid;  2,在父进程中打印变量n的值,并且打印父进程pid。  3,要求分别用fork和vfork创建子进程。 实验五  创建子进程一,在子进程中递归打印/home目录中的内容(用exec系列函数调用第二次实验中的代码完成此功能);  1.子进程结束的时候完成以下功能:  打印字符串“Child process exited!”  打印子进程标识符,打印父进程标识符。  2. 创建子进程二, 打印子进程运行环境中环境变量“USER”的值,通过exec系列中的某个函数设置子进程”USER”环境变量值为“zhangsan”,并且让该子进程完成以下命令:“ls –li /home”.