• 2019-11-27作业


    一、实验目的:

    利用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. 递归下降分析程序

      1 #include "string.h"
      2 #include <stdio.h>
      3 #include<conio.h>
      4 
      5 void lrparser();
      6 void yucu();
      7 void statement();
      8 void expression();
      9 void term();
     10 void factor();
     11 int kk=0;
     12 char prog[80],token[8];
     13 int syn,p,m,n,sum=0;
     14 char ch;
     15 char *rwtab[6]= {"begin","if","then","while","do","end"};
     16 
     17 void scaner() {
     18     m=0;
     19     for(n=0; n<8; n++) token[n]=NULL;
     20     ch=prog[p++];
     21     while(ch==' ') ch=prog[p++];
     22     if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')) {
     23         while((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9')) {
     24             token[m++]=ch;
     25             ch=prog[p++];
     26         }
     27         token[m++]='';
     28         syn=10;
     29         p=p-1;      //回退一个字符
     30         for(n=0; n<6; n++) {
     31             if(strcmp(token,rwtab[n])==0) {
     32                 syn=n+1;
     33                 break;
     34             }
     35         }
     36     } else if(ch>='0' && ch<='9') {
     37         sum=0;
     38         while(ch>='0' && ch<='9') {
     39             sum=sum*10+ch-'0';
     40             ch=prog[p++];
     41         }
     42         p=p-1;
     43         syn=11;
     44     } else {
     45         switch(ch) {
     46             case '<':
     47                 m=0;
     48                 token[m++]=ch;
     49                 ch=prog[p];
     50                 if(ch=='>') {
     51                     syn=21;
     52                     token[m++]=ch;
     53                 } else if(ch=='=') {
     54                     syn=22;
     55                     token[m++]=ch;
     56                 } else {
     57                     syn=20;
     58                     p=p-1;
     59                 }
     60                 p=p+1;
     61                 token[m]='';
     62                 break;
     63             case '>':
     64                 m=0;
     65                 token[m++]=ch;
     66                 ch=prog[p++];
     67                 if(ch=='=') {
     68                     syn=24;
     69                     token[m++]=ch;
     70                 } else {
     71                     syn=23;
     72                     p=p-1;
     73                 }
     74                 break;
     75             case ':':
     76                 m=0;
     77                 token[m++]=ch;
     78                 ch=prog[p++];
     79                 if(ch=='=') {
     80                     syn=18;
     81                     token[m++]=ch;
     82                 } else {
     83                     syn=17;
     84                     p=p-1;
     85                 }
     86                 break;
     87             case '+':
     88                 syn=13;
     89                 token[0]=ch;
     90                 break;
     91             case '-':
     92                 syn=14;
     93                 token[0]=ch;
     94                 break;
     95             case '*':
     96                 syn=15;
     97                 token[0]=ch;
     98                 break;
     99             case '/':
    100                 syn=16;
    101                 token[0]=ch;
    102                 break;
    103             case ';':
    104                 syn=26;
    105                 token[0]=ch;
    106                 break;
    107             case '(':
    108                 syn=27;
    109                 token[0]=ch;
    110                 break;
    111             case ')':
    112                 syn=28;
    113                 token[0]=ch;
    114                 break;
    115             case '=':
    116                 syn=25;
    117                 token[0]=ch;
    118                 break;
    119             case '#':
    120                 syn=0;
    121                 token[0]=ch;
    122                 break;
    123             default:
    124                 syn=-1;
    125         }
    126     }
    127 }
    128 
    129 void lrparser() {
    130     if (syn==1) { //begin
    131         scaner();
    132         yucu();
    133         if (syn==6) { //end
    134             scaner();
    135             if (syn==0 && kk==0) printf("success 
    ");
    136         } else {
    137             if(kk!=1) printf("error,lose 'end' ! 
    ");
    138             kk=1;
    139         }
    140     } else {
    141         printf("error,lose 'begin' ! 
    ");
    142         kk=1;
    143     }
    144     return;
    145 }
    146  
    147 void yucu() {
    148     statement();
    149     while(syn==26) { 
    150         scaner();
    151         statement();
    152     }
    153     return;
    154 }
    155  
    156 void statement() {
    157     if (syn==10) { //为标识符
    158         scaner();
    159         if (syn==18) { //为 :=
    160             scaner();
    161             expression();
    162         } else {
    163             printf("error!");
    164             kk=1;
    165         }
    166     } else {
    167         printf("error!");
    168         kk=1;
    169     }
    170     return;
    171 }
    172  
    173  
    174 void expression() {
    175     term();
    176     while(syn==13 || syn==14) {
    177         scaner();
    178         term();
    179     }
    180     return;
    181 }
    182  
    183  
    184 void term() {
    185     factor();
    186     while(syn==15 || syn==16) {
    187         scaner();
    188         factor();
    189     }
    190     return;
    191 }
    192  
    193  
    194 void factor() {
    195     if(syn==10 || syn==11)scaner(); //为标识符或整常数时,读下一个单词符号
    196     else if(syn==27) {
    197         scaner();
    198         expression();
    199         if(syn==28)scaner();
    200         else {
    201             printf(" ')' 错误
    ");
    202             kk=1;
    203         }
    204     } else {
    205         printf("表达式错误
    ");
    206         kk=1;
    207     }
    208     return;
    209 }
    210  
    211  
    212 int main() {
    213     p=0;int i;
    214     printf("********************语法分析程序***************
    ");
    215     printf("请输入源程序:
    ");
    216     do {
    217         scanf("%c",&ch);
    218         prog[p++]=ch;
    219     } while(ch!='#');
    220     p=0;
    221     scaner();
    222     lrparser();
    223     printf("语法分析结束!
    ");
    224     getch();
    225 }

    测试结果:

     

  • 相关阅读:
    Android 再次打开APP进入按Home键退出时的界面(thisTaskRoot)
    SQL server 安装成功到使用Sa SQL server验证登录等一系列问题
    Android JSON解析插件
    Android utils 工具类之MD5加密 MD5Utils
    Android 避免内存泄漏
    Android utils 之 日志工具类
    Android Studio 第一个Android项目
    Android Studio安装
    JDK 安装与环境配置配置——Android开发第一步
    U盘启动安装系统之旅----记录自己的第一次操作
  • 原文地址:https://www.cnblogs.com/chuichuichui1998/p/11959259.html
Copyright © 2020-2023  润新知