0917 实验一 词法分析 已修改

#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define BEGIN 1
#define IF 2
#define THEN 
#define WHILE 4
#define  DO 5
#define  END 6
#define  INT 11
#define   LT 20
#define   LE 21
#define  EQ 24
#define  NE 22
#define  GT 12
#define  GE 24
#define  IS 18
#define   PL 13
#define   MI 14
#define  MU 15
#define  DI 16
#define SS 17
#define ID 10
#define  AI  26
#define  BI 27
#define  HI 58
#define  JI  0

char *keyword[8]={"begin","end","if","then","do","while"};
int i=0,j=0,k=0,t=0;
char ch,strtoken[20];
char * chr_form[100];
char * int_form[100];
char form[1000];
int q=0,temp;
void GetChar()
{
    ch=form[k];
    k++;
}
void getbc()
{
    while(ch==‘ ‘)
    {

        GetChar();
    }
}
void concat()
{
    strtoken[i]=ch;
    i++;
}
bool isletter()
{
    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
        return(1);
    else
        return(0);
}
bool isdigit()
{
if(((ch)<=‘9‘)&&((ch)>=‘0‘))
return (1);
else
return (0);
}
int reserve()
{
    for(int q=0;q<5;q++)
    {
        if(strcmp(keyword[q],strtoken)==0)
            return q;
        if(q==4)
            return -1;
    }
}
void retract()
{
    k--;
    ch=NULL;
}
char *insertld()
{
    chr_form[j]=strtoken;
    j++;
    return chr_form[0];
}
char * insertconst()
{
    int_form[t]=strtoken;
    t++;
    return int_form[0];
}
int code;
void output(int a,char *p1,char *p2)
{
    cout<<"\t种别码:"<<a<<"\t 单词值:";
        while(p1<=p2)
        {
            printf("%s",*p1);
            p1++;
        }
        cout<<endl;
}

void analyze()
{
    GetChar();
    getbc();
    if(isletter())
    {
        while (isletter()||isdigit())
        {
            concat();
        GetChar();
        }
        retract();
        code=reserve();
        switch(code)
        {
        case 0:cout<<"单词:" <<strtoken<<"  种别码为: "<<BEGIN<<endl;break;

        case 1:cout<<"单词:" <<strtoken<<"  种别码为: "<<END<<endl;break;

        case 2:cout<<"单词:" <<strtoken<<"  种别码为: "<<IF<<endl;break;

        case 3:cout<<"单词:" <<strtoken<<"  种别码为: "<<THEN<<endl;break;
        case 4:cout<<"单词:" <<strtoken<<"  种别码为: "<<DO<<endl;break;
        case 5:cout<<"单词:" <<strtoken<<"  种别码为: "<<WHILE<<endl;break;

      default:
          cout<<"单词:" <<strtoken<<"  种别码为: "<<ID<<endl;break;

    }
    }
    else
    {
        if( isdigit())
        {
          while(isdigit()||ch==‘.‘)
          {
              concat();
              GetChar();
          }
          retract();
          cout<<"单词:"<<strtoken<<"  种别码为:"<<INT<<endl;
        }
        else
        {
            switch(ch)
            {
            case‘+‘: cout<<"单词:+  种别码为: "<<PL<<endl;break;
            case‘-‘: cout<<"单词:-  种别码为: "<<MI<<endl;break;
            case‘*‘: cout<<"单词:*  种别码为: "<<MU<<endl;break;
            case‘/‘: cout<<"单词:/  种别码为: "<<DI<<endl;break;
            case‘;‘: cout<<"单词:;  种别码为: "<<AI<<endl;break;
            case‘(‘: cout<<"单词:(  种别码为: "<<BI<<endl;break;
            case‘)‘: cout<<"单词:)  种别码为: "<<HI<<endl;break;
            case‘#‘: cout<<"单词:#  种别码为: "<<JI<<endl;break;

            case‘:‘:GetChar();
                if(ch==‘=‘)
                {
                    cout<<"单词::=  种别码为: "<<IS<<endl;break;
                }
                else
                {
                    retract();
                    cout<<"单词::   种别码为: "<<SS<<endl;break;
                }
            case‘=‘:cout<<"单词:=  种别码:"<<EQ<<endl; break;
            case‘>‘:GetChar();switch(ch)
                    {
            case‘=‘:cout<<"单词:>=  种别码:"<<GE<<endl;break;
            default: retract;
                cout<<"单词:=> 种别码:"<<GT<<endl;break;
                    }
            case‘<‘:GetChar();
                switch(ch)
                {
                case‘=‘:cout<<"单词:<=  种别码:"<<LE<<endl;break;
                case‘>‘:cout<<"单词:<>  种别码:"<<NE<<endl;break;
               default: retract();
                    cout<<"单词:<  种别码:"<<LT<<endl;break;
            }
        }
    }
    }

    while(k<q)
    {
        for(int p=0;p<50;p++)
            strtoken[p]=‘\0‘;
        i=0;
        analyze();
    }
}

void main ()
{
    printf("输入一段程序,以!结束:");
    form[0]=cin.get();
    for(q=1;form[q-1]!=‘!!‘;q++)
    {
        form[q]=cin.get();
        if(form[q]==‘!‘)
        {
            printf("你输入的程序段为:\n");
            cout.write(form,q);
            break;
        }
    }
    cout<<endl;
    analyze();

}
时间: 2024-12-19 09:54:56

0917 实验一 词法分析 已修改的相关文章

0917 实验一词法分析程序

#include <stdio.h>#include <string.h>int Input1(char a){ int i=0; switch(a) { 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++;b

0917 实验一 词法分析程序

#include <stdio.h> #include <string.h> #include <iostream.h> #define BEGIN 1 #define IF 2 #define THEN 3 #define WHILE 4 #define DO 5 #define END 6 #define INT 11 #define LT 20 #define LE 21 #define EQ 24 #define NE 22 #define GT 12 #def

实验一词法分析报告

实验一.词法分析实验 专业:商业软件工程三班       姓名:郑锦诚      学号:201506110198 一.        实验目的 词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 二.        实验内容和要求 让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出. 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文

hdu 2079 选课时间(题目已修改,注意读题) 多重背包

选课时间(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3162    Accepted Submission(s): 2472 Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合.你来帮帮他吧.(xhd认为一样学分的课没区别

{&quot;集合已修改;可能无法执行枚举操作。&quot;}

无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<int> list = new List<int>{1,2,3,4,5}; foreach(int x in list) { list.Remove(x); //将引发异常:{"集合已修改:可能无法执行枚举操作."} } 使用foreach不能执行删除.修改,这是规定.你可以使用for循环遍历修改. 如果你是删除的话,for循环 i 要从大到小,比如: f

C# 集合已修改;可能无法执行枚举操作

/********************************************************************** * C# 集合已修改;可能无法执行枚举操作 * 说明: * 之前搞Java的时候就很清楚使用多线程操作集合的时候,很容易出现线程 * 安全的问题,还有就是操作线程的时候容易出现集合被修改的问题. * * 2016-12-12 深圳 南山平山村 曾剑锋 ****************************************************

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

Git将未修改文件标记为已修改状态

近几天在Ubuntu系统中使用Netbeans做为开发环境并使用Git作为代码管理的时候,提示代码都被标记为已修改状态,但是进行仔细比较的时候,却发现并没有修改.. 看了以下文章后,根据自身的实际情况对比了下,发现原来我在代码克隆下来的时候,有意的对整个项目目录执行过 chmod 777 ,所以才产生了我现在所遇到的问题! 以下文章参考来源:http://blog.sina.com.cn/s/blog_6accbcc30101fcac.html stackoverflow上一堆人遇到这个问题,大

HDU 2079 选课时间(题目已修改,注意读题)【母函数】

选课时间(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3250    Accepted Submission(s): 2551 Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合.你来帮帮他吧.(xhd认为一样学分的课没区别