编译原理实验1-词法分析

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define KEYWORDEND "waiting for your expanding"

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

char input[255];
char token[255]="";
int pinput;
int ptoken;
char ch;
char *rwtab[]= {"begin","if","then","while","do","end",KEYWORDEND};

WORD *scaner();

int main()
{
    int over=1;
    WORD *oneword=new WORD;
    printf ("enter your words(end with #):");
    scanf("%[^#]s",input);
    pinput=0;
    printf ("your words:\n%s\n",input);
    while(over<1000 && over!=-1)
    {
        oneword=scaner();
        if (oneword->typenum<1000)
            printf ("(%d,%s)",oneword->typenum,oneword->word);
        over=oneword->typenum;
    }
    printf("\npress # to exit:");
    scanf("%[^#]s",input);
    return 0;
}

char mgetch()           //读取一个字符到ch
{
    ch=input[pinput];
    pinput=pinput+1;
    return(ch);
}

void getbc()            //去掉空白符号
{
    while(ch==' ' || ch==10)
    {
        ch=input[pinput];
        pinput=pinput+1;
    }
}

void concat()
{
    token[ptoken]=ch;
    ptoken=ptoken+1;
    token[ptoken]='\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;
    while(strcmp(rwtab[i],KEYWORDEND))
    {
        if(!strcmp(rwtab[i],token))
        {
            return i+1;
        }
        i=i+1;
    }
    return 10;
}

void retract()
{
    pinput=pinput-1;
}

char *dtb()
{
    return NULL;
}

WORD *scaner()
{
    WORD *myword=new WORD;
    myword->typenum=10;
    myword->word="";
    ptoken=0;
    mgetch();
    getbc();
    if (letter())
    {
        while(letter() || digit())
        {
            concat();
            mgetch();
        }
        retract();
        myword->typenum=reserve();
        myword->word=token;
        return(myword);
    }
    else if(digit())
    {
        while(digit())
        {
            concat();
            mgetch();
        }
        retract();
        myword->typenum=11;
        myword->word=token;
        return(myword);
    }
    else switch(ch)
        {
        case'=':
            mgetch();
            if (ch=='=')
            {
                myword->typenum=39;
                myword->word="==";
                return(myword);
            }
            retract();
            myword->typenum=21;
            myword->word="=";
            return(myword);
            break;
        case'+':
            myword->typenum=13;
            myword->word="+";
            return(myword);
            break;
        case'-':
            myword->typenum=14;
            myword->word="-";
            return(myword);
            break;
        case'*':
            myword->typenum=15;
            myword->word="*";
            return(myword);
            break;
        case'/':
            myword->typenum=16;
            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=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':':
            mgetch();
            if (ch=='=')
            {
                myword->typenum=18;
                myword->word=":=";
                return(myword);
            }
            retract();
            myword->typenum=17;
            myword->word=":";
            return(myword);
            break;
        case';':
            myword->typenum=26;
            myword->word=";";
            return(myword);
            break;
        case'>':
            mgetch();
            if (ch=='=')
            {
                myword->typenum=37;
                myword->word=">=";
                return(myword);
            }
            retract();
            myword->typenum=35;
            myword->word=">";
            return(myword);
            break;
        case'<':
            mgetch();
            if (ch=='=')
            {
                myword->typenum=38;
                myword->word="<=";
                return(myword);
            }
            if (ch=='>')
            {
                myword->typenum=21;
                myword->word="<=";
                return(myword);
            }
            retract();
            myword->typenum=20;
            myword->word="<";
            return(myword);
            break;
        case'!':
            mgetch();
            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-02 07:22:05

编译原理实验1-词法分析的相关文章

编译原理实验2-递归下降分析法

#include <stdio.h> #include <string.h> #include <stdlib.h> char prog[80],token[8]; char ch; int syn=-1,p,t; void scanner(); void statement(); void expression_r(); void term(); void factor(); void getcha() { ch=prog[p++]; } void getbc() {

设计-大家明白编译原理的进来瞧瞧

问题描述 大家明白编译原理的进来瞧瞧 编译原理实验系统设计-词法分析的思路,题目要求:B/S架构.主要实现实验内容的演示.作业布置.在线完成作业.作业评分等功能,本题实现词法分析部分.求大神给个思路 解决方案 这题目匪夷所思,此法分析关"bs架构.作业布置.作业评分"什么事.明显一个是牛头,一个是马的身子. 解决方案二: 这题目匪夷所思,词法分析关"bs架构.作业布置.作业评分"什么事.明显一个是牛头,一个是马的身子. 解决方案三: 比如需要下些什么软件,用什么方法

编译原理词法分析

/* 编译原理实验一:词法分析练习 作者:lqf 时间:2013-9-28 */ #include <stdio.h> #include <conio.h> #include <string.h> #define TOKENMAX 100 #define PROGMAX 1000 #define K_ESC 27 void analytics(); //词法分析 void scanner(); //输入扫描 bool isLetter(char ch);//判断字符是否

请求帮忙改代码-编译原理 编译器 java

问题描述 编译原理 编译器 java 词法分析,语法分析,语义分析生成中间代码,目标代码生成.输入c语言,输出汇编语言 解决方案 http://www.cnblogs.com/zhiyinjixu/articles/2251834.html 解决方案二: java编译原理Java编译原理(有感)java编译原理

《编译原理实践与指导教程》——1.2 实验指导

1.2 实验指导 词法分析和语法分析这两块,可以说是在整个编译器当中被自动化得最好的部分.也就是说即使没有任何的理论基础,在掌握了工具的用法之后,也可以在短时间内做出功能很全很棒的词法分析程序和语法分析程序.当然这并不意味着,词法分析和语法分析部分的理论基础并不重要.恰恰相反,这一部分被认为是计算机理论在工程实践中最成功的应用之一,对它的介绍也是编译理论课中的重点.但本节指导内容的重点不在于理论而在于工具的使用. 本节指导内容将分别介绍词法分析工具GNU Flex和语法分析工具GNU Bison

求各位大神帮忙做一下编译原理程序设计

问题描述 求各位大神帮忙做一下编译原理程序设计 1.设计词法分析器 设计各单词的状态转换图,并为不同的单词设计种别码.将词法分析器设计成供语 法分析器调用的子程序.功能包括:具备预处理功能.将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序:能够拼出语言中的各个单词:http://ask.csdn.net/#将拼出的标识符填入符号表:返回(种别码, 属性值).2.目标代码生成器c. 能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇

大前端开发者需要了解的基础编译原理和语言知识

在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Python.JavaScript 这些大众的,也有 Lisp.Perl.Ruby 这些相对小众的.一般来说,当程序员讨论一门语言的时候,默认的上下文经常是:"用 xxx 语言来完成 xxx 任务".所以一直困扰着的我的一个问题就是,为什么完成某个任务,一定要选择特定的语言,比如安卓开发是 Java,前端要用 JavaScript,iOS 开发使用 Objective-C

编译原理学习.

有时候感觉很无助,迷茫的时候,没有精神支柱的时候.[自暴自弃] 进入人生低谷的时候,找不到方向的时候, 总会出现一些让我兴奋和受到鼓舞的东西. 在一次次的脱变中,发现自己需要学习的东西还很多,很多... .. 我感觉不经历一些事情,就不会学会一些事情,不怕你做错事情,就怕你不肯改错. 我又接触词法分析的另一种词法分析算法[转换表],书中如此描述"理解了此算法思想,也就理解了词法分析器的核心". 仔细看了30分钟,反复琢磨,终于理解了此算法的真谛,让我狠高兴,很兴奋,在编程的学习道路又燃

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件.后来,LLVM的scope越来越大,Low Level Virtual Machine已经不足以表示LLVM的全部,于是,LLVM就变成了正式的名字.LLVM可以