一, 实验目的:
利用 C 语言编制递归下降分析程序, 并对简单语言进行语法分析.
编制一个递归下降分析程序, 实现对词法分析程序所提供的单词序列的语法检查和结构分析.
二, 实验原理
每个非终结符都对应一个子程序.
该子程序根据下一个输入符号 (SELECT 集) 来确定按照哪一个产生式进行处理, 再根据该产生式的右端:
每遇到一个终结符, 则判断当前读入的单词是否与该终结符相匹配, 若匹配, 再读取下一个单词继续分析; 不匹配, 则进行出错处理
每遇到一个非终结符, 则调用相应的子程序
三, 实验要求说明
输入单词串, 以 "#" 结束, 如果是文法正确的句子, 则输出成功信息, 打印 "success", 否则输出 "error", 并指出语法错误的类型及位置.
例如:
输入 begin a:=9;x:=2*3;b:=a+x end #
输出 success
输入 x:=a+b*c end #
输出'end' error
四, 实验步骤
1.待分析的语言的语法(参考 P90)
2.将其改为文法表示, 至少包含
- 语句
- 条件
- 表达式
3. 消除其左递归
4. 提取公共左因子
5. SELECT 集计算
6. LL(1)文法判断
7. 递归下降分析程序
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- char wsym[80],ssym[80];
- char ch;
- int row,syn,sum,m,i,p;
- char *Word[6]={"begin","if","then","while","do","end"};
- int flag=0;
- void E();
- void T();
- void E1();
- void T1();
- void F();
- void E(){
- if(syn==1){
- getsyn();
- T();
- while(syn==26){
- getsyn();
- T();
- }
- if(syn==6){
- getsyn();
- if(syn==0 && flag==0){
- printf("success!\n");
- }
- }
- else{
- printf("语法错误, 缺少 end!\n");
- }
- }else{
- printf("语法错误, 缺少 begin!\n");
- flag=1;
- }
- return ;
- }
- void T(){
- if(syn==10){
- getsyn();
- if(syn==18){
- getsyn();
- E1();
- }else{
- printf("表达式语法有误! 错误为:%s\n",ssym);
- flag=1;
- }
- }else{
- if(flag!=1){
- printf("表达式语法有误, 错误为:%s\n",ssym);
- flag=1;
- }
- }
- }
- void E1(){
- T1();
- while(syn==13||syn==14){
- getsyn();
- T1();
- }
- return ;
- }
- void T1(){
- F();
- while(syn==15||syn==16){
- getsyn();
- F();
- }
- return ;
- }
- void F(){
- if(syn==10||syn==11){
- getsyn();
- }else if(syn==27){
- getsyn();
- E1();
- if(syn==28)
- getsyn();
- else{
- printf("没有')', 语法有误!\n");
- flag=1;
- }
- }
- else{
- printf("表达式语法有误! 错误为:%s\n",ssym);
- flag=1;
- }
- return ;
- }
- int main(){
- p=0;
- printf("请输入语句段:");
- do{
- ch=getchar();
- wsym[p++]=ch;
- }while(ch!='#');
- p=0;
- getsyn();
- E();
- printf("分析结束!");
- getchar();
- }
不会做
来源: http://www.bubuko.com/infodetail-3309092.html