词法分析(作业)

#include<stdio.h>
#include<string.h>
#define N 30
char str[N]={NULL},st[N]={NULL};
int t=0,t1=0;
struct node//定义一个队列
{
    char data;
    struct node * next;
};
typedef struct node QueueNode;
struct node2//定义一个链队列
{
    QueueNode *front;
    QueueNode *rear;
};
typedef struct node2 Queue;
void Print(char str[]);
void Print1(char str1[]);
Queue InitQueue()//初始化队列
{
    Queue Q;
    Q.front=(QueueNode *)malloc(sizeof(QueueNode));
    Q.front->next=NULL;
    Q.rear=Q.front;
    return(Q);
}
Queue InserQ(Queue Q,char x)//x进队列
{
    QueueNode *p;
    p=(QueueNode *)malloc(sizeof(QueueNode));
    p->data=x;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return(Q);
}
Queue DeleteQ(Queue Q)//出队列
{
    int i=t++,j;
    QueueNode *p;
    char y=NULL;
    if(Q.front==Q.rear)
    {
        printf("队列为,无法出队列!");//判断队列是否为空
        return(Q);
    }
    p=Q.front->next;
    y=Q.front->next->data;//将队列中的元素赋值给y
    Q.front->next=p->next;
    if(p==Q.rear)
        Q.rear=Q.front;
    if((y>=‘A‘&&y<=‘Z‘)||(y>=‘a‘&&y<=‘z‘))//利用ASCII判断y是否是属于字母,并存储在数组str中
        str[i]=y;
    else
    {
        if(str[0]!=NULL)//如果数组str非空,则输出
            Print(str);
        t=0;
        if(y==‘+‘)
            printf("(13,‘%c‘)\n",y);
        else if(y==‘-‘)
            printf("(14,‘%c‘)\n",y);
        else if(y==‘*‘)
            printf("(15,‘%c‘)\n",y);
        else if(y==‘/‘)
            printf("(16,‘%c‘)\n",y);
        else if(y==‘:‘)
        {
            if(p->next->data==‘=‘)//判断运算是否是由两个字符组成
            {
                printf("(18,‘%c%c‘)\n",y,p->next->data);
                Q.front->next=p->next->next;
                free(p->next);
            }
            else
                printf("(17,‘%c‘)\n",y);
        }
        else if(y==‘<‘)
        {
            if(p->next->data==‘=‘)//判断运算是否是由两个字符组成
            {
                printf("(21,‘%c%c‘)\n",y,p->next->data);
                Q.front->next=p->next->next;
                free(p->next);
            }
            else if(p->next->data==‘>‘)//判断运算是否是由两个字符组成
            {
                printf("(22,‘%c%c‘)\n",y,p->next->data);
                Q.front->next=p->next->next;
                free(p->next);
            }
            else
                printf("(20,‘%c‘)\n",y);
        }
        else if(y==‘>‘)
        {
            if(p->next->data==‘=‘)//判断运算是否是由两个字符组成
            {
                printf("(24,‘%c%c‘)\n",y,p->next->data);
                Q.front->next=p->next->next;
                free(p->next);
            }
            else
                printf("(23,‘%c‘)\n",y);
        }
        else if(y==‘=‘)//判断字符是否是运算符
            printf("(25,‘%c‘)\n",y);
        else if(y==‘;‘)
            printf("(26,‘%c‘)\n",y);
        else if(y==‘(‘)
            printf("(27,‘%c‘)\n",y);
        else if(y==‘)‘)
            printf("(28,‘%c‘)\n",y);
        else if(y==‘#‘)
            printf("(0,‘%c‘)\n",y);
        else if(y>=48&&y<=57)//判断字符是否为数字
        {
            j=t1++;
            if(j==0)
                printf("(11,‘");
            printf("%c",y);
            if(p->next->data<48||p->next->data>57)//判断队列中下一个字符是否为数字,如果是非字符数字,则输出数组st
                if(st[0]!=‘\o‘)
                {
                    printf("‘)\n");
                    t1=0;
                }
        }
        else if(y==‘ ‘);
        else
            printf("(非法字符,‘%c‘)\n",y);//其他的当作特殊符号处理
    }
    free(p);
    return Q;
}
int main()
{
    char x,y;
    Queue p,q;
    p=InitQueue();
    printf("请输入你想输入的字母、单词、短语、句子、字符等(必须以非数字结尾,否则程序出错):\n");
    while(scanf("%c",&x)==1&&x!=‘\n‘)//大神的方法,牛
        p=InserQ(p,x);
    q=p;
    while(p.front!=p.rear)
        p=DeleteQ(p);
    if(str[0]!=‘\o‘)//判断数组str是否为空
        Print(str);
}
void Print(char str[])//调用函数来判断关键字与标识符
{

    int i=0;
    if(strcmp(str,"begin")==0)
        printf("(1,‘%s‘)\n",str);
    else if(strcmp(str,"if")==0)
        printf("(2,‘%s‘)\n",str);
    else if(strcmp(str,"then")==0)
        printf("(3,‘%s‘)\n",str);
    else if(strcmp(str,"while")==0)
        printf("(4,‘%s‘)\n",str);
    else if(strcmp(str,"do")==0)
        printf("(5,‘%s‘)\n",str);
    else if(strcmp(str,"end")==0)
        printf("(6,‘%s‘)\n",str);
    else
    {
        if(str[0]==‘\0‘)
            return;
        printf("(10,‘%s‘)\n",str);
    }
    memset(str,0,N);//清空数组str里的所有元素
}

时间: 2024-08-26 10:16:05

词法分析(作业)的相关文章

词法分析作业

实验一.词法分析实验 专业   姓名  学号 一.        实验目的       编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种码,单词符号本身). 三.        实验方法.步骤及结果测试   1.     源程序名:压缩包文件(rar或zip)中源程序名cifafenxiqi.c 可执行程序名:cifafenxi.exe 2.     原理分析及流程图 主要总体设计问题. (包括存储结构,主要算法,关键函数的实现等) 3.     主

0916编译原理词法分析作业二

#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]=""; //单词缓冲区 i

Python之路day13 web 前端(JavaScript,DOM操作)

参考链接:http://www.cnblogs.com/wupeiqi/articles/5433893.html day13 1. CSS示例 2. JavaScript 3. DOM操作 上节内容回顾: 1. HTML标签 html/head/body/ input div,span a p br span table > tr行 th表头列 td表头列 h form> action method enctype=;;; select option input系列: text passwo

编译原理第二次作业——词法分析心得

今次大作业是词法分析,这次的词法分析的程序编写,有遇到很多的问题,比如说如何去定义单词与数字还有符号之间的判断关系,怎么去用数组存储输入进去的字符串,还有就是判断的一些程序不懂该如何去编写. 有一些问题我是通过百度去解决的还有一些则是通过同学的帮助而去完成的,希望下一次能自己完成不需要帮忙. 而通过这次实验,我也开始明白了编译的一些基本的原理,更加的明白编译器编写的过程需要注意的一些错误,充分认识到了自己的很多不足之处,而这也为我以后再次去编译提供很多宝贵的经验,课本有很多地方都能够在实验中去借

作业--词法分析的源代码与运行结果

词法分析的源代码与运行结果: #include<stdio.h> /*定义I/O库所用的某些宏和变量*/#include<string.h> /*定义字符串库函数*/#include<conio.h> /*提供有关屏幕窗口操作函数*/#include<ctype.h> /*分类函数*/char prog[80]={'\0'}, token[8]; /*存放构成单词符号的字符串*/char ch;int syn, /*存放单词字符的种别码*/ n, sum,

编译原理小作业词法分析程序

词法分析程序所参照的编码如70页表3.3 (<编译技术>张莉等著.--北京:高等教育出版社,2016.9.ISBN: 978-7-04-046317-0) 用Java语言实现如下: 1 import java.io.IOException; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 import java.util.Map; 5 6 class Code{ 7 public static final int BEGINSY

0916编译原理作业二词法分析

#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]=""; //单词缓冲区 i

0916作业二词法分析

#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]=""; //单词缓冲区 i

0916 词法分析第二次作业

#include<stdio.h> #include <string.h> #include<iostream.h> main(){ char a[200]; char cf,bf; int i,b; b=0; printf("请输入字符(输入#结束):"); do { scanf("%c",&cf); a[b++]=cf; }while(cf!='#'); for(i=0;i<b;i++) { bf=a[i]; i