语法分析器实验报告2 下载本文

一、实验目的

设计、编制并调试一个语法分析程序,加深对语法分析原理的理解。 二实验要求

要求语法分析器的输入是单词串(含词的字符串形式、在源文件中的起止位置、词的类别),输出是源程序中各句子的单词起止编号、句子的语法树。 三实验内容

以下不同语法分析器中任选一个:

1. 递归下降分析器。可分解为:文法输入及解析、消除左递归、提取左公

共因子、产生式匹配。

2. LL(1)分析器。可分解为:文法输入及解析、分析表构造(含SELECT集

求解)、主控程序、语法树展示。

3. 算符优先文法分析器。可分解为:文法输入及解析、分析表构造、主控

程序、语法树展示。

4. LR(1)分析器。可分解为:文法输入及解析、分析表构造(含项目及项目

簇集求解)、主控程序、语法树展示。

四、实验步骤

给定的文法G[E] E->TE’ E’->+TE’ | ε T->FT’ T’->*F T’| ε F->(E) | i

采用递归下降分析法编写语法分析程序及LL(1)语法分析法编写语法分析程序。 实验代码:

#include #include #include #define N 100

int seekProd(int stackTop,int inputstrTop); //char inputstr[10]=\ char inputstr[20]; char stack[10]=\

typedef struct production{ char leftChar;

char rightChars[4]; char allChars[8]; }Prod;

Prod productions[8]; void init();

int stackPush(int *top, Prod prod);

int matching(int *top, char *inputstr); int main() {

int len;//输入串的长度 int stackTop=1; int inputstrTop=0; int i;

char *z=\ int index=0;

init();//产生式初始化

stack[0]='#';

stack[stackTop]='E';

printf(\请输入字符串:\ gets(inputstr);

len=strlen(inputstr); inputstr[len]='#'; while( stackTop>=0 ) {

// printf(\ printf(\第-步:\ printf(\当前栈:%-8s\

printf(\输入字符串:%8s\ //根据栈定元素和字符串首字母

if(matching(&stackTop,inputstr)){ printf(\ }else{

i=seekProd(stackTop,inputstrTop);

stackPush(&stackTop,productions[i]);//压栈

printf(\进行下一步所用的产生式:%s\\n\ } }

if(stackTop+1==0) {

printf(\分析成功!\\n\ }

return 0; }

//搜索分析表

int seekProd(int stackTop,int inputstrTop) {

// printf(\ if(stack[stackTop]=='E'){

if(inputstr[inputstrTop]=='i') {

return 0;

}else if(inputstr[inputstrTop]=='('){ return 0; }else{

return -1; }

}else if(stack[stackTop]=='X'){ if(inputstr[inputstrTop]=='+') {

return 1;

}else if(inputstr[inputstrTop]==')'){ return 2;

}else if(inputstr[inputstrTop]=='#'){ return 2; }else{

return -1; }

}else if(stack[stackTop]=='T'){ if(inputstr[inputstrTop]=='i') {

return 3;

}else if(inputstr[inputstrTop]=='('){ return 3; }else{

return -1; }

}else if(stack[stackTop]=='Y'){ if(inputstr[inputstrTop]=='+') {

return 5;

}else if(inputstr[inputstrTop]=='*'){ return 4;

}else if(inputstr[inputstrTop]==')'){ return 5;

}else if(inputstr[inputstrTop]=='#'){ return 5; }else{