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","end"};
    int p=0,j=0,k=0,m=0,q=1;
    int key=0;
    printf("请输入源程序(以#键结束):");
    do{
        scanf("%c",&a);
        word[p]=a;
        p++;
    }while(a!=‘#‘);

    //关键字的判断    

    while(word[i]!=‘#‘)
    {
    while((word[i]>=‘a‘&&word[i]<=‘z‘)||(word[i]>=‘A‘&&word[i]<=‘Z‘)||(word[i]>=‘0‘&&word[i]<=‘9‘))
    {
        if((word[i]>=‘a‘&&word[i]<=‘z‘)||(word[i]>=‘A‘&&word[i]<=‘Z‘)||(word[i]>=‘0‘&&word[i]<=‘9‘))
        {
            token[n]=word[i];
            n++;
            token[n]=‘\0‘;
            i++;
            if(word[i]>=‘0‘&&word[i]<=‘9‘)
                q++;
        }

    for(k=0;k<6;k++)
    {
        key=0;
        if(strcmp(rwtab[k],token)==0)
        {
            printf("%s   %d\n",rwtab[k],k+1);
            key=1;
            break;
        }
    }    }
     if((word[i-q]>=‘a‘&&word[i-q]<=‘z‘)||(word[i-q]>=‘A‘&&word[i-q]<=‘Z‘))
     {
    if(key==0)
    {
            printf("%s   10\n",token);
    }
        }
    key=1;
    i=i+1;
    n=0;
    }
    fuhao();
    shuzi();
}
//特殊符号的判断
void fuhao()
{
    int p=0,sign=0;
    for(p=0;p<max;p++)
    {
        switch(word[p])
        {
        case ‘+‘:
            printf("+    13\n");
            break;
        case ‘-‘:
            printf("-    14\n");
            break;
        case ‘*‘:
            printf("*    15\n");
            break;
        case ‘/‘:
            printf("/    16\n");
            break;
        case ‘:‘:
            if(word[p+1]==‘=‘)
            {
                printf(":=   18\n");
                p++;
            }
            else
                printf(":    17\n");
            break;
        case ‘<‘:
            if(word[p+1]==‘=‘)
            {
                printf("<=     21\n");
                sign=1;
                p++;
            }
            else if(word[p+1]==‘>‘)
            {
                printf("<>     22\n");
                sign=1;
                p++;
            }
            else if(sign==0)
                printf("<    20\n");
            break;
        case ‘>‘:
            if(word[p+1]==‘=‘)
            {
                printf(">=    24\n");
                p++;
            }
            else
                printf(">    23\n");
            break;
        case ‘=‘:
            printf("=    25\n");
            break;
        case ‘;‘:
            printf(";    26\n");
            break;
        case ‘(‘:
            printf("(    27\n");
            break;
        case ‘)‘:
            printf(")    28\n");
            break;
        case ‘#‘:
            printf("#    29\n");
            break;
        }
    }
}
//数字的判断
void shuzi()
{
    int p=0,j=0,t=0,key=0,q=1;
    char Shu[100];
    while(word[p]!=‘#‘)
    {
        key=0;
        j=0;

    while(word[p]>=‘0‘&&word[p]<=‘9‘)
    {
        Shu[j]=word[p];
        p++;
        j++;
        key=1;
        q++;
    }
    if((word[p-q]>=‘a‘&&word[p-q]<=‘z‘)||(word[p-q]>=‘A‘&&word[p-q]<=‘Z‘))
    {
        key=0;
        q=1;
    }

    if(key==1)
    {
        for(t=0;t<j;t++)
        {
            printf("%c",Shu[t]);
        }
        printf("    11\n");
        j=0;
    }
    p++;
    }

}

时间: 2024-12-19 00:51:42

1014编译原理第二次作业(修改版1)的相关文章

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.4 语法制导翻译

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

编译原理第一次上机作业感想

这次的上机弄懂了许多编译器的原理,做得也很仔细. 在学习了编译原理后我开始明白编译的工作原理了,也更了解编译语言的结构.明白了编译器的编写中需要注意的各项问题,更了解了编译器的编译过程为我之后的编程提供了一 些必不可少的经验,还是我的改错能力有所提高.因为写编译器使我在编程发生错误后能及时了解程序在编译过程中的原理是什么,这样我就能知道我的程序是何处的问题.

0909 编译原理第一次上机作业

1.编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 2.这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理这门课程讲的就是比较专注解决一种的算法了. 3.认真听课,多动手编程.总结经验,巩固知识. 4.(1)对源语言和目标语言认真分析(2)设计编译

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

Java第六次作业修改版

import java.util.ArrayList; import java.util.Collections; import java.util.Random; public class Draw { private ArrayList<Integer>list; public Draw(){ list = new ArrayList<Integer>(); } public void deal(int num){ //向容器中添加奖券(使用循环) for (int i=0;i