资源简介

编译原理实验 语法分析器的程序,是采用的算符优先文法,是大三时候写的,很全,里面包括源程序 和实验报告等。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#define SIZE 128
char priority[7][7];  //算符优先关系数组
char input[SIZE];     //存放输入的要进行分析的句子
char remain[SIZE];    //存放剩余串
char AnalyseStack[SIZE];  //分析栈
void analyse();
int  testchar(char x);  //判断字符X在算符优先关系表中的位置
void remainString();    //移进时处理剩余字符串,即去掉剩余字符串第一个字符
int k;
void init()
{
priority[0][0]=‘>‘;
priority[0][1]=‘<‘;
priority[0][2]=‘<‘;
priority[0][3]=‘<‘;
priority[0][4]=‘<‘;
priority[0][5]=‘>‘;
priority[0][6]=‘>‘;

priority[1][0]=‘>‘;
priority[1][1]=‘>‘;
priority[1][2]=‘<‘;
priority[1][3]=‘<‘;
priority[1][4]=‘<‘;
priority[1][5]=‘>‘;
priority[1][6]=‘>‘;

priority[2][0]=‘>‘;
priority[2][1]=‘>‘;
priority[2][2]=‘<‘;
priority[2][3]=‘<‘;
priority[2][4]=‘<‘;
priority[2][5]=‘>‘;
priority[2][6]=‘>‘;

priority[3][0]=‘>‘;
priority[3][1]=‘>‘;
priority[3][2]=‘>‘;
priority[3][3]=‘$‘;//无优先关系的用$表示
priority[3][4]=‘$‘;
priority[3][5]=‘>‘;
priority[3][6]=‘>‘;

priority[4][0]=‘<‘;
priority[4][1]=‘<‘;
priority[4][2]=‘<‘;
priority[4][3]=‘<‘;
priority[4][4]=‘<‘;
priority[4][5]=‘=‘;
priority[4][6]=‘$‘;

priority[5][0]=‘>‘;
priority[5][1]=‘>‘;
priority[5][2]=‘>‘;
priority[5][3]=‘$‘;
priority[5][4]=‘$‘;
priority[5][5]=‘>‘;
priority[5][6]=‘>‘;

priority[6][0]=‘<‘;
priority[6][1]=‘<‘;
priority[6][2]=‘<‘;
priority[6][3]=‘<‘;
priority[6][4]=‘<‘;
priority[6][5]=‘$‘;
priority[6][6]=‘=‘;
}
void analyse()
{
int ijfzz1nn1z2n2;
int count=0;//操作的步骤数
char a; //存放正在分析的字符
char pQp1p2;
f=strlen(input);  //测出数组的长度
for(i=0;i<=f;i++)
{
a=input[i];
if(i==0)
remainString();
if(AnalyseStack[k]==‘+‘||AnalyseStack[k]==‘*‘||AnalyseStack[k]==‘^‘||AnalyseStack[k]==‘i‘||AnalyseStack[k]==‘(‘||AnalyseStack[k]==‘)‘||AnalyseStack[k]==‘#‘)
j=k;
else
j=k-1;
z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系
if(a==‘+‘||a==‘*‘||a==‘^‘||a==‘i‘||a==‘(‘||a==‘)‘||a==‘#‘)
n=testchar(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
printf(“错误!该句子不是该文法的合法句子!\n“);
break;
}
p=priority[z][n];
if(p==‘$‘)
{
printf(“错误!该句子不是该文法的合法句子!\n“);
return;
}
if(p==‘>‘)
{
loop:        Q=AnalyseStack[j];
 if(AnalyseStack[j-1]==‘+‘||AnalyseStack[j-1]==‘*‘||AnalyseStack[j-1]==‘^‘||AnalyseStack[j-1]==‘i‘||AnalyseStack[j-1]==‘(‘||AnalyseStack[j-1]==‘)‘||AnalyseStack[j-1]==‘#‘)
 j=j-1;
 else
 j=j-2;
 z1=testchar(AnalyseStack[j]);
 n1=testchar(Q);
 p1=priority[z1][n1];
 if(p1==‘<‘)  //AnalyseStack[j+1]~AnalyseStack[k]归约为N
 {
 count++;
 printf(“(%d)     %s\t%10c\t%5c%17s\t    归约\n“countAnalyseStackparemain);
 k=j+1; 
 i--;
 AnalyseStack[k]=‘N‘;
 int rr1;
 r=strlen(AnalyseStack);
 for(r1=k+1;r1  AnalyseStack[r1]=‘\0‘;
 }
 else
 goto  loop;
}
else
{
if(p==‘<‘)  //移进
{
                //remainString();
count++;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        540  2008-12-22 12:52  1926219语法分析\1926219_语法分析.dsw

     文件      41984  2008-12-23 23:18  1926219语法分析\1926219_语法分析.ncb

     文件       5560  2008-12-25 23:38  1926219语法分析\1926219_语法分析.cpp

     文件        929  2008-12-22 23:20  1926219语法分析\1926219_语法分析.plg

     文件       4406  2008-12-22 13:33  1926219语法分析\1926219_语法分析.dsp

     文件      73216  2008-12-23 23:16  1926219语法分析\1926219_语法分析_设计报告.doc

     文件      40448  2008-12-22 13:12  1926219语法分析\1926219_语法分析_使用说明.doc

     文件      53760  2008-12-23 23:18  1926219语法分析\1926219_语法分析.opt

     文件      61440  2008-12-22 12:52  1926219语法分析\Debug\vc60.pdb

     文件      16618  2008-12-22 23:20  1926219语法分析\Debug\1926219_语法分析.obj

     文件     217165  2008-12-22 23:20  1926219语法分析\Debug\1926219_语法分析.exe

     文件     418816  2008-12-22 12:52  1926219语法分析\Debug\1926219_语法分析.pdb

     文件      45056  2010-03-05 10:45  1926219语法分析\1926219_语法分析_测评报告.doc

     目录          0  2010-03-05 10:44  1926219语法分析\Debug

     目录          0  2010-03-05 10:44  1926219语法分析

----------- ---------  ---------- -----  ----

               979938                    15


评论

共有 条评论