预测分析表构造c语言,预测分析算法的设计与实现

一、实验目的

通过预测分析算法的设计与实现,加深对自上而下语法分析方法的理解,尤其是对自上而下分析条件的理解。

二、实验要求

输入文法及待分析的输入串,输出其预测分析过程及结果。

三、实验步骤

1. 参考数据结构

(1)

typedef struct{

char formula[200];//产生式

}grammarElement;

grammarElement

gramOldSet[200];//原始文法的产生式集

(2)

char terSymbol[200];//终结符号

char non_ter[200];//非终结符号

char allSymbol[400];//所有符号

char firstSET[100][100];//各产生式右部的FIRST集

char followSET[100][100];//各产生式左部的FOLLOW集

int M[200][200];//分析表

2. 判断文法的左递归性,将左递归文法转换成非左递归文法。(该步骤可以省略,直接输入非左递归文法)。

3.根据文法求FIRST集和FOLLOW集。

(1)

begin

if X为终结符(XÎ

)

在所有产生式中查找X所在的产生式

if

产生式右部第一个字符为终结符或空(即X®a(aÎ

)或X®e)

then 把a或e加进FIRST(X)

if 产生式右部第一个字符为非终结符 then

if产生式右部的第一个符号等于当前字符

then

跳到下一条产生式进行查找

if 当前非终结符还没有求其FIRST集

then

查找它的FIRST集并标识此符号已求其FIRST集

求得结果并入到X的FIRST集

if

当前产生式右部符号可推出空字且当前字符不是右部的最后一个字符

then 获取右部符号下一个字符在所有字符集中的位置

if

此字符的FIRST集还未查找

then

找其FIRST集,并标其查找状态为1

把求得的FIRST集并入到X的FIRST集

if

当前右部符号串可推出空且是右部符号串的最后一个字符(即产生式为X®

,若对一切1£

k,均有e

ÎFIRST( ),则将eÎ符号加进FIRST(X)) then

把空字加入到当前字符X的FIRST集

else

不能推出空字则结束循环

标识当前字符X已查找其FIRST集。

end

(2)

begin

if

X为开始符号

then # ÞFOLLOW(X)

对全部的产生式找一个右部含有当前字符X的产生式

if

X在产生式右部的最后(形如产生式A®aX) then

查找非终结符A是否已经求过其FOLLOW集.避免循环递归

if非终结符A已经求过其FOLLOW集

then

把FOLLOW(A)中的元素加入FOLLOW(X)

继续查下一条产生式是否含有X

else

求A的FOLLOW集,并标记为A已求其FOLLOW集

else if X不在产生式右部的最后(A®aBb) then

if

右部X后面的符号串b能推出空字e

then

查找b是否已求过其FOLLOW集.避免循环递归

if 已求过b的FOLLOW集

then

把FOLLOW(A)中的元素加入FOLLOW(B)

结束本次循环

else if b不能推出空字

then

求 FIRST(b)

把FIRST(b)中所有非空元素加入到FOLLOW(B)中

标识当前要求的非终结符X的FOLLOW集已求过

end

4.构造预测分析表。

//在AÎ

所在行,aÎ

所在列, M[A,a]的填写方法如下:

if (A®dÎP and aÎFIRST(d) ) do

M[A,a]=‘A®d’

if (dÞ*e(eÎFIRST(d)) and aÎFOLLOW(A)) do

M[A,a]=‘A®d’;

else

do

M[A,a]=‘ERR’.

5.构造总控程序。

6.对给定的输入串,给出分析过程及结果。

四、实验报告要求

1.写出编程思路、源代码(或流程图);

2.写出上机调试时发现的问题,以及解决的过程;

3.写出你所使用的测试数据及结果;

4.谈谈你的体会。

5.上机8小时,完成实验报告2小时。

#include

#include

#include

#include

char ch;

FILE *fp;

char A[20];//分析栈

char B[20];//剩余串

char vt[8]={'i','+','*','(',')','#','-','/'};//终结符号

char vn[5]={'E','G','T','H','F'};//非终结符号

int j=0;

int b=0;

int top=0;

int flag[8]={0};

int flagfollow[5]={0};

int number;

int l;

typedef struct fode

{

char a[20];

int len;

}fode;

fode First[8];

fode firstset[5];

fode Follow[5];

typedef struct type{

char o;//大写字母

char array[5];//右边

char length;//长度

}type;

type e,g,p,t,h,q,f,r;

type C[10][10];//预测分析表

void fuzhi(){

e.o='E';

strcpy(e.array,"TG");

e.length=2;

g.o='G';

strcpy(g.array,"+TG");

g.length=3;

p.o='G';

p.array[0]='^';

p.length=1;

t.o='T';

strcpy(t.array,"FH");

t.length=2;

h.o='H';

strcpy(h.array,"*FH");

h.length=3;

q.o='H';

q.array[0]='^';

q.length=1;

f.o='F';

strcpy(f.array,"(E)");

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值