zoukankan      html  css  js  c++  java
  • 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 }

    测试结果:

     

  • 相关阅读:
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 697 数组的度(类似于数组的map)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 696 计数二进制子串(暴力)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    Java实现 LeetCode 695 岛屿的最大面积(DFS)
    PHP serialize() 函数
    PHP print_r() 函数
  • 原文地址:https://www.cnblogs.com/chuichuichui1998/p/11959259.html
Copyright © 2011-2022 走看看