编译原理第二次试验

#include<stdio.h> #include<string.h> void Fenxi(char c,char b); void word(char a[]); void number(char a[]); int i; int s=1; main(){     char a[100];     printf("请输入源程序:");     gets(a);     printf("%s",a);     printf("\n");     for(i=0;(a[i]!=‘\0‘)&&(i<100)&&s==1;i++)     {         if((a[i]>=‘a‘ && a[i]<=‘z‘)||(a[i]>=‘A‘ && a[i]<=‘Z‘))             word(a);         else if(a[i]>=‘0‘ && a[i]<=‘9‘)             number(a);         else             Fenxi(a[i],a[i+1]);     }     printf("\n"); }

void number(char a[])  //对数字字符进行扫描分析 {     char b[50];     int m,k=0,t;     m=i;     while(a[m]>=‘0‘ && a[m]<=‘9‘)      {         b[k]=a[m];   //用数组b存放数组a中的数字         k++;         m++;     }     i=m-1;     printf("(11,");     for(t=0;t<k;t++)             printf("%c",b[t]);     printf(")"); }

void word(char a[])   {     int k=0,m,flag=0,t;     char b[50];     char *key[6]={"begin","if","then","while","do","end"};     m=i;     while((a[m]>=‘a‘&&a[m]<=‘z‘)||(a[m]>=‘A‘&&a[m]<=‘Z‘))  //用数组b存放数组a中的字母     {         b[k]=a[m];           k++;         b[k]=‘\0‘;         m++;                                                                                                                         }     i=m-1;     for(t=0;t<6;t++)     {         if(strcmp(b,key[t])==0)         {             printf("(%d,%s)",t+1,key[t]);              flag=1;         }     }     if(flag==0)     {         printf("(10,%s)",b);      } } void Fenxi(char c,char b)  //对特殊字符进行扫描分析 {     switch(c){         case ‘ ‘:             break;         case ‘+‘:             printf("(13,+)");             break;         case ‘-‘:             printf("(14,-)");             break;         case ‘*‘:             printf("(15,*)");             break;         case ‘/‘:             printf("(16,/)");             break;         case ‘:‘:             if(b==‘=‘)             {                 i++;                 printf("(18,:=)");             }             else                 printf("(17,:)");             break;         case ‘<‘:             if(b==‘>‘)             {                 i++;                 printf("(21,<>)");             }             else if(b==‘=‘)             {                 i++;                 printf("(22,<=)");             }             else                 printf("(20,<)");             break;         case ‘>‘:             if(b==‘=‘)             {                 printf("(24,>=)");                 i++;             }             else                 printf("(23,>)");             break;         case ‘=‘:             printf("(25,=)");             break;         case ‘;‘:             printf("(26,;)");             break;         case ‘(‘:             printf("(27,()");             break;         case ‘)‘:             printf("(28,))");             break;         case ‘#‘:             printf("(20,#)");             break;         default:             {             printf("\n存在字符 ‘%c‘,无法继续识别!\n",c);             s=0;    //用s=0记录存在非法字符             break;             }     } }

时间: 2024-10-10 02:29:22

编译原理第二次试验的相关文章

编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译

语法制导翻译: 定义:语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的 功能:给定词法单元流,通过向一个文法产生式附加一些语义动 作,语法制导分析产生语法分析树,并实现翻译动作 相关概念: 属性:表示与某个程序构造相关的任意的量,因为用文法符号(终结符号或非终结符号)来表示程序构造,所以可将属性的概念从程序构造扩展到表示这些构造的文法符号上 综合属性:如果某个属性在语法分析树节点N上的值由N的子节点和N本身的属性值确定,则该属性为综合属性,其性质为只需对语法分析树进行一次自底向

编译原理第二次作业 编译器任务总结

在学习了编译原理后我开始明白编译的工作原理了,也更了解编译语言的结构.明白了编译器的编写中需要注意的各项问题,更了解了编译器的编译过程为我之后的编程提供了一些必不可少的经验,还是我的改错能力有所提高.因为写编译器使我在编程发生错误后能及时了解程序在编译过程中的原理是什么,这样我就能知道我的程序是何处的问题. 而且在学习编译原理的时候,学到了一些比较难理解的东西,通过实践不断地消化书本上的理论,最终就会有一个雏形出现.而且在编写的过程时候有一些不知道如何解决的问题时,我就会和组员讨论以得出一个可行

编译原理第二次作业——词法分析心得

今次大作业是词法分析,这次的词法分析的程序编写,有遇到很多的问题,比如说如何去定义单词与数字还有符号之间的判断关系,怎么去用数组存储输入进去的字符串,还有就是判断的一些程序不懂该如何去编写. 有一些问题我是通过百度去解决的还有一些则是通过同学的帮助而去完成的,希望下一次能自己完成不需要帮忙. 而通过这次实验,我也开始明白了编译的一些基本的原理,更加的明白编译器编写的过程需要注意的一些错误,充分认识到了自己的很多不足之处,而这也为我以后再次去编译提供很多宝贵的经验,课本有很多地方都能够在实验中去借

0916编译原理第二次上机作业

#include<stdio.h> void Fenxi(a,b); int i; main(){ char a[50]; printf("请输入源程序:"); gets(a); printf("您要分析的源程序为:"); printf("%s",a); printf("\n"); for(i=0;i<50;i++) { Fenxi(a[i],a[i+1]); } printf("\n")

0916 编译原理第二次上机实验

#include<stdio.h>#include<string.h>void Fenxi(char c,char b);void word(char a[]);void number(char a[]);int i;  //定义全局变量iint s=1; //用来记录是否存在非法字符main(){    char a[50];    printf("请输入源程序:");    gets(a);    printf("您要分析的源程序为:")

1014编译原理第二次作业(修改版1)

#include<stdio.h> #include<string.h> #define max 100 int n=0,i=0; char token[max]; char a; char word[max]; void fuhao(); void shuzi(); main() { char *rwtab[6]={"begin","if","then","while","do",

0916 编译原理第二次上机作业

#include<stdio.h>#include<string.h>#include<iostream.h>char prog[80],token[8];char ch;int syn,p,m=0,n,row,sum=0;char *rwtab[6]={"begin","if","then","while","do","end"}; void sca

1014编译原理第二次作业(修改版)

#include<stdio.h> #include<string.h> #define MAX 100 int n=0,i=0; char *keyshuru[6]={"begin","if","then","while","do","end"}; void KEYword(char shuru[MAX]) { int k=0,key=0,q=1; char t

编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义

语法定义: 文法定义: 定义:用以描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”,文法自然地描述了大多数程序设计语言构造地层次化语法结构 实例: 如果用变量expr来表示表达式,用变量stmt表示语句,则 相关概念: 产生式:使用箭头(→)表示"可以具有如下形式",用相关变量表示表达式和语句的构造规则产生的式子.每个生产式包括一个称为生产式头或左部的非终结符号,一个箭头,和一个称为生产式体或右部的由终结符号组成的序列. 终结符号:有时也称为词法单元,终结符号是该文法