case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while(digit(s)){ token[j]=s; j=j+1; get(); } retract(); printf(\ break; case '+':printf(\ case '-':printf(\ case '*':printf(\ case '<':get(); if(s=='=') printf(\ else{retract(); printf(\ } break; case '=': get(); if(s=='=') printf(\ else{ retract(); printf(\ } break; case ';': printf(\ break; case ' ':break; default:printf(\ } j=0; get();
} }
六:实验结果:
实验二
一、 实验名称:语法分析器的设计 二、 实验目的:
用C语言编写对一个算术表达式实现语法分析的语法分析程序,并以四元式的形式输出,以加深对语法语义分析原理的理解,掌握语法分析程序的实现方法和技术。 三、 实验原理:
1、算术表达式语法分析程序的算法思想
首先通过关系图法构造出终结符间的左右优先函数f(a),g(a)。在分析的过程中,通过左右优先函数比较当前读入终结符与前一个读入终结符间的优先关系,分析后适时的以四元式形式输出相关的符号。
2、通过优先函数关系图构造优先函数
优先函数表 f g + 4 3 * 6 5 i 6 7 ( 2 7 ) 6 2 优先函数关系图
f+ f* fi f( f)
g+ g* gi g( g)
四、实验内容:
1、实验分析
本实验所用文法是: G[E]:E->E+E|E-E|E*E|E/E|(E)
E->0|1|2|3|……|9
根据此文法编写程序时,算术表达式的求解过程需要用到算术符号的优先判断,定义两个字符串数组optr[]、opnd[]用来模拟栈,存放算术符和操作数,用a[]来存放表达式字符串,在分析时还要通过函数int f(char c)和int g(char c),判断运算符之间的优先关系,根据不同情况作各种不同操作。流程图如下:
输入算数表达式,以#结束 初始化loptr[1]=’#’ 用get()取一个待分析字符s Optr[1]和s是否同时为# 判断S是否为运算量 存入opnd[] get() 其他情况error() Floptrj]
char a[21],optr[10],op,s; int opnd[10],i,j,k,x1,x2,x3; int operand(char s)
{if((s>=48)&&(s<=57)) return 1;
else return 0; }
int f(char s) {switch(s){
case '+':return 4;break; case '*':return 6;break; case 'i':return 6;break; case '(':return 2;break; case ')':return 6;break; default:return 0;} }
int g(char s) {switch(s){
case '+':return 3;break; case '*':return 5;break; case 'i':return 7;break; case '(':return 7;break; case ')':return 2;break; default:return 0;} }
void get() {s=a[i]; i++;}
void main()
{printf(\请输入表达式(以‘#’结束):\\n\i=0; do{i++;
scanf(\}while(a[i]!='#'); i=j=k=1; optr[j]='#'; get();
while(!((optr[j]=='#')&&(s=='#')))
{if(operand(s)) {opnd[k]=s-48;k++;get();} else if (f(optr[j])
default:break; } opnd[k]=x3; k++; printf(\ } else {j--;get();} } }
3实验结果:
心得体会:
通过本次实验,我更加深刻的学习到了很多:
1、通过实验我对词法分析和语法分析原理有了更深刻的理解。 2、而且对词法分析和语法分析在实践中的应用有了深入的掌握。
3、更加熟悉了构造词法分析程序和语法分析程序的手工方式的相关原理,能够实现对词法分析程序所提供的单词符号序列进行相应的语法检查和结构分析,达到了学以致用的目的。