0909 初识编译原理

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_END "waiting for your expanding"     //关键字结束标志

typedef struct
{
    int typenum;
    char * word;
}WORD;

char input[255];   //输入换缓冲区 

char token[255]="";   //单词缓冲区

int p_input;        //输入换缓冲区指针

int p_token;        //单词缓冲区指针

char ch;           //当前所读的字符

char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END};        //C语言关键字

WORD * scaner();    //词法扫描函数,获得关键字

main()
{
    int over=1;
    WORD *oneword;
    oneword=(WORD *)malloc(sizeof(WORD));
    printf("请输入您的字符串(以#作为结束标志):");
    scanf("%[^#]s",input);
    p_input=0;
    printf("您输入的字符串是:%s\n\n",input);
    while(over<1000&&over!=-1)
    {
        oneword=scaner();
        printf("(%d,%s)\n",oneword->typenum,oneword->word);
        over=oneword->typenum;
    }

}

//需要用到的自编函数参考实现
//从输入缓冲区读取一个字符到ch中

char m_getch(){
    ch=input[p_input];
    p_input=p_input+1;
    return (ch);
}

//去掉空白字符
void getbc()
{
    while(ch==‘ ‘||ch==10){
    ch=input[p_input];
    p_input=p_input+1;
    }
}

//拼接单词
void concat()
{
    token[p_token]=ch;
    p_token=p_token+1;
    token[p_token]=‘\0‘;
}

//判断是否字母
int letter()
{
    if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)return 1;
    else return 0;
}

//判断是否数字
int digit()
{
    if(ch>=‘0‘&&ch<=‘9‘)
        return 1;
    else
        return 0;
}

//检索关键字表格
int reserve()
{
    int i=0;
    for(i=0;i<7;i++)
    {
        if(!strcmp(rwtab[i],token))
        {
            return i+1;
        }
        i=i+1;
    }
    return 10;
}

//回退一个字符
void retract()
{
    p_input=p_input-1;
}

WORD *scaner()
{
    WORD *myword;
    myword=(WORD *)malloc(sizeof(WORD));
    myword->typenum=10;
    myword->word="";
    p_token=0;
    m_getch();
    getbc();
    if(letter())
    {
        while(letter()||digit())
        {
           concat();
           m_getch();

        }
        retract();
         myword->typenum=reserve();
        myword->word=token;
        return(myword);
    }
    else if(digit())
    {
        while(digit())
        {
            concat();
            m_getch();
        }
        retract();
        myword->typenum=20;
        myword->word=token;
        return(myword);
    }
    else
    {
        switch(ch)
        {
        case ‘=‘:m_getch();
            if(ch==‘=‘)
            {
                myword->typenum=39;
                myword->word="==";
                return(myword);
            }
            retract();
            myword->typenum=21;
            myword->word="=";
            return(myword);
            break;
        case ‘+‘:
            myword->typenum=22;
                myword->word="+";
                return(myword);
                break;
        case ‘-‘:
            myword->typenum=23;
                myword->word="-";
                return(myword);
                break;
        case ‘*‘:
            myword->typenum=24;
            myword->word="*";
            return(myword);
            break;
        case ‘/‘:
            myword->typenum=25;
            myword->word="/";
            return(myword);
            break;
        case ‘(‘:
            myword->typenum=26;
            myword->word="(";
            return(myword);
            break;
        case ‘)‘:
            myword->typenum=27;
            myword->word=")";
            return(myword);
            break;
        case ‘[‘:
            myword->typenum=28;
            myword->word="[";
            return(myword);
            break;
        case ‘]‘:
            myword->typenum=29;
            myword->word="]";
            return(myword);
            break;
        case ‘{‘:
            myword->typenum=30;
            myword->word="{";
            return(myword);
            break;
        case ‘}‘:
            myword->typenum=31;
            myword->word="}";
            return(myword);
            break;
        case ‘,‘:
            myword->typenum=32;
            myword->word=",";
            return(myword);
            break;
        case ‘:‘:
            myword->typenum=33;
            myword->word=":";
            return(myword);
            break;
        case ‘;‘:
            myword->typenum=34;
            myword->word=";";
            return(myword);
            break;
        case ‘>‘:
            myword->typenum=35;
            myword->word=">";
            return(myword);
            break;
        case ‘<‘:
            myword->typenum=36;
            myword->word="<";
            return(myword);
            break;
        case ‘!‘:
            m_getch();
            if(ch==‘=‘)
            {
                myword->typenum=40;
                myword->word="!=";
                return(myword);
            }
            retract();
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            break;
        case ‘\0‘:
            myword->typenum=1000;
            myword->word="OVER";
            return(myword);
            break;
        default:
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            }
        }
    }
时间: 2024-08-26 03:13:23

0909 初识编译原理的相关文章

0909走进编译原理

1.编译原理学什么? 编译原理这一学科,主要学习的是编译器方面的原理与技术,我们能从中学会各种算法与代码的原理,明白计算机是如何“听懂人话”,我们的代码是如何经过编译器转换成机器语言,这样不仅能实现自己去编写简单的小编译器,也能通过此学科去接触已有各编译器的思想,认识到编程方面更多要注意的问题以及解决的方向,站在本质的角度看代码,从而更能成就计算机专业人员的计算机逻辑思维. 2.为什么要学编译原理? 说到编译原理,人们喜欢把这门学科比作人体解剖和造轮子,是计算机中和代码作斗争的一门学科.据本人理

0909对编译原理的初了解

1.编译原理学什么? "编译原理":研究设计和构造编译程序原理和方法以及主要实现技术.其中蕴含着计算机科学中解决问题的思路.形式化问题和解决问题的方法.通过本课程的学习,使学生掌握编译理论和方法方面的基本知识,同时也获得设计.实现.分析和移植编译程序方面的初步能力. 编译原理(第3版)共10章,内容包括语言及文法的基本知识.词法分析.语法分析.语义分析及中间代码生成.符号表组织.运行时的存储组织与分配.代码优化及目标代码生成等.此外编译原理是一门实践性较强的课程,要联系实际,多看实验参

0909关于编译原理

1.编译原理学什么? 答:“编译原理”主要讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,其内容包括语言及文法的基本知识.词法分析.语法分析及中间代码生成.代码优化.目标代码生成. 2.为什么要学习编译原理? 答:因为编译原理可以使我们达到不一样的技术,不但要知其然,还要知其所以然,这样才能应对技术的不断的更新,才能不被技术的1发展所淘汰,而且编译原理讲的是比较专注解决一种算法了. 3.怎么学编译原理? 答:首先认真听讲,跟随上老师的步骤,根据基础然后举一反三,平常多多思

0909对编译原理的理解

1.编译原理学什么? 编译原理旨在让人们学习编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成,而且这门课程关注的是编译器方面的产生原理和技术问题.回归到本质上,学习编译原理其实也就是学习一个相对复杂的算法. 2.为什么学编译原理? 编译原理这门课程实际蕴含着计算机学科中解决问题的思路.形式化问题和解决问题的方法,这些思路和方法除了对应用软件和系统软件的设计与开发有一定的启发和指导作用外,在提倡学科的交叉不断创新

0909 初遇编译原理

编译原理学什么?      编译原理是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要专业基础课.编译原理主要学习的是编译程序结构及各部分功能.文法和语言         的基本概念和表示.词法分析.语法分析.属性文法与语法制导翻译技术.符号表.运算时存储空间的组织.代码优化与目标代码生成.并行编译技术概述等. 为什么学编译原理?      编译原理这门课程实际蕴含蕴含着计算机学科中解决问题的思路.形式化问题和解决问题的方法,这些思路和方法除了对应用软件和系统软件的设计与开发

0909关于编译原理课程的认识

1.编译原理学什么?编译原理是学习编译技术的基本理论和实现技术,包括语言文法的基本知识.词法分析.语法分析.语义分析及中间代码.目标代码生成等内容: 2.为什么学编译原理?可以使我们学生既掌握编译理论和方法方面的基本知识,而且也获得设计.实现.分析.和移植编译程序方面的初步能力: 3怎么学编译原理?首先要巩固先前所学习的c,数据结构等课程,以及即将要学习的离散数学,多提疑问,多参考有关书籍,借助互联网等工具与人交流. 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路?    

0909 对编译原理的理解

1.编译原理学什么? 学习编写编译器,将高级语言(自己的代码)翻译成为机器语言. 2.为什么学编译原理? 更好的理解高级语言转化为机器语言,更好的认识编译器原理. 3.怎么学编译原理? 先了解编译原理的相关知识,并找些相关书籍理解,在课外时间多练习.实践,来更好学习编译原理. 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路? 在写编译器之前,我们必须先有c语言上有一定的基础.然后在对编译原理上才能学的更好.

0909关于编译原理的理解

1.编译原理学什么? 答:编译原理学习做程序的编译器的原理和方法,内容包括语言和文法.词法分析.语法分析.语法制导翻译和中间代码生成.储存管理.代码优化和目标代码生成等内容. 2.为什么学编译原理? 答:编译原理蕴含着计算机科学中解决问题的思路.形式化问题和解决问题的方法,对软件的设计开发具有一定的指导作用,学习它可以更了解程序本身,对以后的学习有一定的帮助. 3.怎么学编译原理? 答:对于编译原理一上手可能会有难度,课堂上要认真听讲.做笔记,不懂之处一定要提出,但更重要的是要注重结合程序来代码

0909 关于编译原理的理解

1.编译原理学什么? 答:编译原理是学习如何制作编译器,从而能够将自己所写的代码能够转换成机器能明白的语言,各种文法.各种词法语法分析算法,语义分析要处理很多很多细节,特别对于比较复杂的语言:最后的指令生成,可能需要读各种手册,也比较枯燥. 2.为什么学编译原理? 答:理解机器是如何理解高级语言的,能够理解自己所写的代码是如何转换成为机器的低级语言并且运行. 3.怎么学编译原理? 答:先去了解有关编译原理的基本知识,再结合程序代码进行学习,并且要学习编译原理的语言,去网上看有关如何学习编译原理的