内容发布更新时间 : 2024/11/16 21:26:23星期一 下面是文章的全部内容请认真阅读。
一、实验目的
设计、编制并调试一个语法分析程序,加深对语法分析原理的理解。 二实验要求
要求语法分析器的输入是单词串(含词的字符串形式、在源文件中的起止位置、词的类别),输出是源程序中各句子的单词起止编号、句子的语法树。 三实验内容
以下不同语法分析器中任选一个:
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
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{