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

#include<stdio.h>
#include<string.h>
void Fenxi(char c,char b);
void word(char a[]);
void number(char a[]);
int i;  //定义全局变量i
int s=1; //用来记录是否存在非法字符
main(){
    char a[50];
    printf("请输入源程序:");
    gets(a);
    printf("您要分析的源程序为:");
    printf("%s",a);
    printf("\n");
    for(i=0;(a[i]!=‘\0‘)&&(i<50)&&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)  //将数组b与关键字进行比较
        {
            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-08-04 06:14:06

0916 编译原理第二次上机实验的相关文章

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>#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

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

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

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

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

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

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

软件测试第二次上机实验

这次上机我们主要使用Selenium进行自动化测试,首先我们需要下载selenium-java的依赖项. 若使用maven管理项目,则在.pom文件中加入如下依赖项: <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.53.0</version> </dep

数据结构第二次上机实验【链表实现多项式的加法和乘法】

利用链表实现一元多项式的加法和乘法 #define null 0 #include "stdio.h" #include "stdlib.h" #include "math.h" int op; typedef struct { float coef;//系数 int expn;//指数 }term; typedef struct Lnode { term data; Lnode *next; }*Link,*Linklist; int cmp(

算法第二章上机实验报告

1.实践题目 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行:第一行是n值:第二行是n个整数:第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入样例: 4 1 2 3 4 1 输出样例: 0 2 2.问题描述 本道题是让我们输入非降序排列的整数,也就是说是排好

编译原理第二次试验

#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("\