1008词法分析

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define M 1000

struct key

{

    char g[20];

};

typedef struct key KEY;

int main()

{

    KEY k[6];

    int i=0,j=0;

    char a[M],b[M];

    strcpy(k[0].g,"begin");

    strcpy(k[1].g,"if");

    strcpy(k[2].g,"then");

    strcpy(k[3].g,"while");

    strcpy(k[4].g,"do");

    strcpy(k[5].g,"end");

    printf("请输入源程序:\n");

    gets(a);

    while(a[i]!=‘\0‘)

    {

        j=0;

        if((isalpha(a[i]))||(a[i]==‘_‘))

        {

            while((a[i]!=‘ ‘)&&(a[i]!=‘\0‘))

            {

                if((isalpha(a[i]))||(isdigit(a[i])))

                {

                 b[j]=a[i];

                 j++;

                 i++;

                }

                else

                    break;

            }

            if((a[i]==‘ ‘)||(a[i]==‘\0‘))

            {

                b[j]=‘\0‘;

                if(strcmp(b,k[0].g)==0)

                    printf("begin\t种别码   1\n");

                else if(strcmp(b,k[1].g)==0)

                    printf("if   \t种别码   2\n");

                else if(strcmp(b,k[2].g)==0)

                    printf("then \t种别码   3\n");

                else if(strcmp(b,k[3].g)==0)

                    printf("while\t种别码   4\n");

                else if(strcmp(b,k[4].g)==0)

                    printf("do   \t种别码   5\n");

                else if(strcmp(b,k[5].g)==0)

                    printf("end  \t种别码   6\n");

                else

                    printf("%s  \t种别码   10\n",b);

            }

            else

            {

                b[j]=‘\0‘;

                printf("%s   \t种别码       10\n",b);

                i--;

            }

        }

        else if(isdigit(a[i]))

        {

            j=0;

            while(isdigit(a[i]))

            {

                 b[j]=a[i];

                 j++;

                 i++;

            }

            b[j]=‘\0‘;

            printf("%s    \t种别码    11\n",b);

            i--;

        }

        else

        {

            switch(a[i])

            {

            case ‘+‘:

                printf("%c   \t种别码   13\n",a[i]);break;

            case ‘-‘:

                printf("%c   \t种别码   14\n",a[i]);break;

            case ‘*‘:

                printf("%c   \t种别码   15\n",a[i]);break;

            case ‘/‘:

                printf("%c   \t种别码   16\n",a[i]);break;

            case ‘:‘:

                if(a[i+1]==‘=‘)

                {   printf(":=   \t种别码   18\n");i++;break;}

                else

                {   printf("%c   \t种别码   17\n",a[i]);break;}

            case ‘<‘:

                if(a[i+1]==‘=‘)

                {   printf("<=   \t种别码   21\n");i++;break;}

                if(a[i+1]==‘>‘)

                {   printf("<>   \t种别码   22\n");i++;break;}

                else

                    printf("%c   \t种别码   20\n",a[i]);break;

            case ‘>‘:

                if(a[i+1]==‘=‘)

                {   printf(">=   \t种别码   24\n");i++;break;}

                else

                    printf("%c   \t种别码   23\n",a[i]);break;

            case ‘=‘:

                printf("=    \t种别码    25\n");break;

            case ‘;‘:

                printf(";   \t种别码    26\n");break;

            case ‘(‘:

                printf("(   \t种别码   27\n");break;

            case ‘)‘:

                printf(")   \t种别码   28\n");break;

            case ‘#‘:

                printf("#   \t种别码   0\n");break;

            default:

                printf("%c   \t语法错误!\n",a[i]);break;

            }

        }

        i++;

    }

}

        

时间: 2024-10-24 05:31:03

1008词法分析的相关文章

简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)

说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到TokenList 语法分析 输出语法树 运行输出: 代码: main.cpp 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<vector> 4 #include<string.h> 5 using na

1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格

词法分析实验报告

词法分析实验报告 一.        实验目的 编制一个词法分析器,通过该词法分析程序的设计实例,进一步了解词法分析程序构造的一些细节. 二.        实验内容和要求 实验内容: 对字符串表示的源程序,从左到右进行扫描和分解.根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用,若发现词法错误,则返回出错信息. 实验要求: 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三. 实验方法.步骤及结果测试 源程序名:压缩包文件(rar或zip)中源程序

词法分析

词法分析 #include<stdio.h> #include<string.h> void main() { int i=0,j,k=0,state=1,f=0,linenum=1; char a[11][10]={"const","var","call","begin","if","while","do","odd",&

杭电女生赛1001 1002 1003 1005 1008 hdu6023 6024 6025 6027 6030

代码先贴这里 #include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm&quo

问题 1008: C语言程序设计教程(第三版)课后习题5.6

/******************************************************************** @file Main.cpp @date 2017-5-8 @author Zoro_Tiger @brief 问题 1008: C语言程序设计教程(第三版)课后习题5.6 http://www.dotcpp.com/oj/problem1008.html ***************************************************

1008 Envy

1008: Envy 时间限制: 1 Sec  内存限制: 128 MB提交: 288  解决: 61[提交][状态][讨论版] 题目描述 今年的 ACM 比赛推出了一个赛后的娱乐活动,所有参赛选手排成一排玩击鼓传花,关于击鼓传花的玩法是这样的:  数人或几十人围成圆圈坐下,其中一人拿花(或一小物件):另有一人背着大家或蒙眼击鼓(桌子.黑板或其他能发出声音的物体),鼓响时众人开始依次传花,至鼓停止为止.此时花在谁手中(或其座位前),谁就上台表演节目(多是唱歌.跳舞.说笑话:或回答问题.猜谜.按纸

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]