预测分析法实验报告

   

实验报告

             

实验名称:预测分析法  

姓名:            

专业班级:    

学号:  

指导老师:        


一、目的要求

  1. 构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法分析。

2.      加深对预测分析LL(1)分析法的理解和掌握。

二、实验内容

对文法G进行语法分析,文法G如下所示:

*0. S→a */

*1. S→^ 

*2. S→(T)

*3. T→SW *

*4. W→,SW

*5. W→ε;

并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。

程序输入/输出示例:

输入:一个以 # 结束的符号串:例如:(a,a)#

输出:

  步数    分析栈  输入串  所用规则

  (1)     #S      (a,a))#     2

三、源程序

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char str[100];  //存储待分析的句子

const char T[ ]   = "a^(),#";  //终结符,分析表的列符

const char NT[ ]  = "STW"; //非终结符,分析表的行符

/*指向产生式右部符号串*/ 

const char *p[] = {

/*0.  S→a */   "a",

/*1.    S→^       */  "^",

/*2.  S→(T)  */     "(T)",

/*3.  T→SW */       "SW",

/*4.    W→,SW  */   ",SW",

/*5.  W→ε;  */    ""

};

//设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。

const int M[][6] = {             

    /*         a   ^   (   )   ,   #   */

       /*S*/       {  0,  1,  2, -1, -1, -1 },                                         

       /*T*/       {  3,  3,  3, -1, -1, -1 },                                        

       /*W*/     {  -1, -1,-1,  5,  4,  -1 } 

};

void init()//输入待分析的句子

{

       printf("请输入待分析的句子(以$结束):\n");

       scanf("%s",str);

}

int lin(char c);//非终结符转换为行号

int col(char c);//终结转换为列号

bool isNT(char c);//isNT判断是否是非终结符

bool isT(char c);//isT判断是否是终结符。

void main(void)

{    

       int i,j=0;

       int flag=1,flag2=0;

       char A;    //设置指示句子的当前字符

       char stack[20]=      {'#','S'}; //栈赋初值

       int top = 1 ;    //设置栈顶指针

       char X = ' ' ;   //存储栈顶字符

       init();

       A=str[0];    

       printf("\t步数\t分析栈\t输入串\t所用规则\n");       //在屏幕上输出列表标题

       while ( 1 )

       {                                

              printf("\n\t(%d)\t",++j); //输出当前执行步数           

              for ( i = 0 ; i <= top ; i++ )  //输出当前栈的内容(出栈前)

              {                  

                     printf("%c",stack[i]);                  

              }    

              printf("\t");

              for ( i = flag-1 ; str[i]!='$' ; i++ )

              {

                     printf("%c",str[i]);              

              }    

              if(flag2==1)

              {

                     printf("\t%d",M[ lin(X) ][col(A)]);

                     flag2=0;

              }

              //出栈

              X = stack[top--] ;         

              if (X=='#')//是结束符

              {                                                     

                     if (X==A)//是结束符

                     {                                                     

                            printf("\tAcc\n");

                     }

                     else printf("\tERROR\n");                  

                            break;                  

              }

              else if (isT(X))//是终结符

              {                         

                            A=str[flag++];             

              }

              else if (isNT(X))//是否是非终结符

              {                         

                         flag2=1;

                            //逆序入栈

                            for( i = strlen( p[ M[ lin(X) ][col(A)] ] ) - 1; i >= 0; i--)

                            {

                                   stack[++top] = *(p[M[lin(X)][col(A)]] + i ) ;

                            }                  

              }

              else

              {                  

                     printf("Error in main()>%c\n",X);                    

                     exit(0);

              }

       }

}

int lin(char c)

{                  

       for(int i = 0; i < (int)strlen(NT); i ++ )

       {

              if (c == NT[i])

              {

                     return i ;

              }

       }    

       printf("Error in lin()>%c\n",c);

       exit(0) ;

}

int col(char c)

{                  

       for (int i=0; i<(int)strlen(T); i ++ )

       {

              if (c == T[i])  return i;         

       }    

       printf("Error in col()>%c\n",c);

       exit(0);

}

bool isNT(char c)  //是否是非终结符

{

       for (int i = 0; i < (int)strlen(NT); i ++ )

       {

              if (c==NT[i])                      

                     return true;           

       }

       return false;

}

bool isT(char c)  //是否是终结符(不包括'#')

{

       for (int i = 0; i < (int)strlen(T) - 1; i ++ )

       {

              if (c == T[i])

              {

                     return true;

              }

       }

       return false;

}

四、程序运行截图

当输入为 (a,a,a,a)#$ 时

22.jpg

当输入为 (a)#$ 时

3.jpg

经过分析,实验运行的结果与期望的结果相同,故知程序正确。

实验总结

这次的实验让我进一步巩固了以往所学的知识,进一步意思到自己的长处与不足,主要是不足,以后我需要更加女里的学习,争取期末不挂科!!!!



 

第二篇:网孔分析法实验报告

实验名称: 网孔电路分析实验 

     

 姓名:赵吉浩???

实验日期:20##-6-4                                                           

 班级:定2

???                                     

学号:?201201100349

??                                ??                                    

 合作者:魏言兵    

???                                  ???                                 

 提交报告时间:

?

一. 实验目的 

1.网孔电路分析法可以使用与复杂的电路分析。

2.比较理论计算结果与实际测量结果证明网孔分析法。在此试验中,我们将通过建立含三个网孔的电路,用网孔法分析电路。

3基尔霍夫电流定律(KCL):   

4基尔霍夫电压定律(KVL):  

二.实验设备及元件

1. 模拟实验软件:CircuitMaker 5.5

2.实验设备:实验教学板,数字是万用表,可调式15伏直流电源

3.实验原件:470,680,330,1,220电阻,仪表连接线,WG25电路连接线若干(根据实验教学板而定)。

三.实验程序  

第一部分

1.模拟以下电路:应用模拟实验软件CircuitMaker 5.5模拟以下网络电路图1——1,测量个支路的电流及个电阻的电压值并且记录数据。

模拟电路

模拟电路

第二部分

实验步骤:

1. 根据电阻条码的读解, 测量电阻R1, R2, R3, R4, R5并且记录将用于电路的电阻

值, 填入表格1-1 

2. 在教学实验板上, 建立如图的网孔网络电路电路 

3. 接通电压电源之前,使用万用表测量电源电压,调节电源电压使之输出电压达

到电路所需的电压值。 

4. 接通电压电源, 注意电源电压的正负极 

5. 实际测量每个电阻上的电压降,将测量结果填入表格1-1。 

6. 根据测量的电阻值及相应的电压降, 利用欧姆定理计算通过各电阻的电流, 填入

表格1-1, 并且记录电流方向。

 7. 关闭或断开电源电压。?

?四. 实验数据分析与处理

表格1-1

五.实验问题解答

1.         使用电路图1-1, 使用所测量的电阻值, 利用网孔电路分析法决定网孔1,2,3的网孔电流 I1, I2, I3

网孔1(330+1018)I1-330I2-1018I3-12=0                      I1=28.3mA     

网孔2:(469+330+674)I2-330I1-674I3=0       解得        I2=15.8mA                                 

:网孔3:(674+222+1018)I3-1018I1-674I2=0                    I3=20.6mA             

2.         利用网孔电路电流I1, I2, I3,通过代数运算,决定通过每个电阻的电流,同时,记录电流方向,填入表格1-1。

i1=I2=15.8mA    i2=I3-I2=4.8mA     i3=I1-I2=12.5mA

i4=I1-I3=7.7mA     i5=I3=20.6mA

3..验证  基尔霍夫电压定律(KVL):

   网孔1:U3+U4-U=0           4.19+7.86-12=0.05V

网孔2:U1-U2-U3=0        7.51-3.29-4.19= 0.03V  

网孔3: U2-U4+U5=0      3.29 -7.86+4.60=0.03V                   

因此可验证KVL成立。

4.验证 基尔霍夫电流定律(KCL):

节点1:I1+I3-I4-I5=0                    16.0+12.7-7.7-20.7=0.3mA

节点2:-I1-I2+I5=0                      -16.0-4.9+20.7=0.1 mA                            

节点3:-I3+I2+I4=0                        -12.7+4,9+7.7=-0.1mA

节点4:I1+I3-I4-I5=0                    16.0+12.7-7.7-20.7=0.3mA

由实验数据在误差范围内可得:KCL成立。

六.实验总结

1.动手能力不足,对面包板不是很了解。自己的动手能力有待提高。

2.英语水平不高,很长时间找不到电阻.电源.电压表等原件。

3.通过对电路的学习,相信会提高我的动手能力。

相关推荐