词法分析(自己的想法)

#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==‘+‘||y==‘-‘||y==‘*‘||y==‘/‘||y==‘:‘||y==‘<‘||y==‘>‘)//判断字符是否是运算符
        {
            if(p->next->data==‘=‘)//判断运算是否是由两个字符组成
            {
                printf("(运算符,%c%c)\n",y,p->next->data);
                Q.front->next=p->next->next;
                free(p->next);
            }
            else
                printf("(运算符,%c)\n",y);
        }
        else if(y==‘=‘)//判断字符是否是运算符
            printf("(运算符,%c)\n",y);
        else if(y>=48&&y<=57)//判断字符是否为数字
        {
            j=t1++;
            st[j]=y;//将字符数字赋值给数组st
            if(p->next->data<48||p->next->data>57)//判断队列中下一个字符是否为数字,如果是非字符数字,则输出数组st
                if(st[0]!=‘\o‘)
                {
                     printf("(常数,%s)\n",st);
                     memset(st,0,N);//清空数组str里的所有元素
                     t1=0;
                }
        }
        else if(y==33||y==34||(y>=39&&y<=41)||y==44||y==46||y==58||y==59||(y>=91&&y<=96)||(y>=123&&y<=125))//判断是否为界符
            printf("(界符,%c)\n",y);
        else if(y==‘ ‘)
            printf("(空格符,%c)\n",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,"break")==0||strcmp(str,"case")==0||strcmp(str,"char")==0||strcmp(str,"const")==0||strcmp(str,"continue")==0||strcmp(str,"default")==0||strcmp(str,"do")==0||strcmp(str,"double")==0||strcmp(str,"else")==0||strcmp(str,"enum")==0||strcmp(str,"extern")==0||strcmp(str,"float")==0||strcmp(str,"for")==0||strcmp(str,"goto")==0||strcmp(str,"if")==0||strcmp(str,"int")==0||strcmp(str,"long")==0||strcmp(str,"register")==0||strcmp(str,"return")==0||strcmp(str,"short")==0||strcmp(str,"signed")==0||strcmp(str,"sizeof")==0||strcmp(str,"static")==0||strcmp(str,"struct")==0||strcmp(str,"switch")==0||strcmp(str,"typedef")==0||strcmp(str,"unsigned")==0||strcmp(str,"union")==0||strcmp(str,"void")==0||strcmp(str,"volatile")==0||strcmp(str,"while")==0||strcmp(str,"auto")==0)
        printf("(关键字,%s)\n",str);
    else
    {
        if(str[0]==‘\0‘)
            return;
        printf("(标识符,%s)\n",str);
    }
    memset(str,0,N);//清空数组str里的所有元素
}

时间: 2024-11-01 18:26:05

词法分析(自己的想法)的相关文章

实验报告1—’词法分析

实验一.词法分析实验 专业:商业软件工程   姓名:钟菲菲  学号:201506110191 一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串: 输出:二元组(种别,单词符号本身). 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名词法分析.c 可执行程序名:词法分析.exe 2.      原理分析及流程图 主要总体设计问题. 3.      主要程序段及其解释: void

1022词法分析实验总结

经过这次词法分析的实验之后,收获良多.弥补了一些知识空洞,以前不懂的知识也弄懂了. 显然这都得力于组员之间的合作与帮助,一人负责编写,其他在旁边给想法同时学习.程序中运用了许多for,if,while等的循环语句, 有时会思路混乱或者弄不懂,因此,组员之间的沟通发挥了极大的作用,把模板写得比较清晰.刚开始我也不太清楚strcpy的用法,最后通过其他成员的耐心讲解,我不但理解了它的用法,还懂得了其他语句的用法,对c语言有更深入的了解. “数组末尾要加上‘\0’才是字符串”才能被程序读懂,同时是字符

一个配置表优化的想法

今天下班在班车上想了一个关于配置表存储的小优化,起因是早上的时候发现了一个bug,这个bug是由于在运行时动态更改了一个列表配置导致的. 其实关于这种运行时"偷偷"改配置的问题我之前也有考虑过,这种应该是一不小心就会写出的,这不终于都出了一个. 至于如何预防这种问题,我认为在python里面似乎也没有什么好的解决方法,因为它不像c++有const语义,但有一个稍尽人事的预防措施就是把列表型的配置读成元组(tuple).而由此衍生出的一个想法便是:把配置表中所有的列表型配置都读成共享的元

看死亡笔记后的想法(一)

最近在看Death Note,特别是逮捕火口的前后几集,很精彩,也有了自己的一些看法. 逮捕火口之前,八人会议中的三位高管聚到一起商议,他们八人中到底谁是基拉,他们都认为是火口,看来公司高管没有一个是简单的呢 他们认为是火口的原因之一是他看起来对名利毫不在意,我的想法是 一个人表现出对什么东西越是装作不在意,就可能越是在意. 对一些东西,比如钱,或者地位,大家都想要的东西,某个人对它并不在意,这是否如他所说,就值得怀疑 并且,如果这个人的身份跟他的话矛盾,比如是公司高管,但天天说自己不在意地位和

词法分析实验报告

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

只想把技术做好,维持一份可观的收入,就精专一门;有创业想法,就全栈

做全栈开发(前端和后端)好还是全端开发(前端和Android应用开发)好?哪个前景和钱景发现比较好,对以后的发展! 1. 有创业想法,就全栈.只想把技术做好,维持一份可观的收入,就精专一门 2. 全栈对自己的优势不大吗?好多公司都不认同,特别是HR,普遍的观点是,会的多,就很难专精. 3. 大公司是一个靠分工增加工作效率的机构,无论你全栈,还是全端,对公司来说都只用你的一部分技能.但是薪资可是要比一般的人高一些,所以很多HR都忽悠你说全会的就没法专精.先全栈,后全端.别信那些HR忽悠. 4. 有

企业怎样玩转10亿网民?田溯宁有不一样的想法!

京东商城创始人刘强东在中美互联网论坛上表示,中国是世界上最大的互联网市场,未来十年中国网民将超10亿.阿里巴巴创始人马云谈到当前中国传统企业经营压力增大,但更应该看到新经济增长的势头不亚于美国,中国市场潜力巨大.联想CEO杨元庆则提到,现在是一个资源全球配置的时代. 面对一个拥有全球最大网民规模.员工数量动辄上万的企业规模.全球化资源配置以及新经济增长模式层出不穷的转型时代,传统企业究竟要如何实现互联网+.如何玩转即将出现的10亿网民所带来的数据红利和网民人口红利?被誉为中国"互联网建筑师&qu

有个想法,想吧LNMP和NGINX和HAPROXY都放到docker里做集群,大家觉得怎么样?

有个想法,想把LNMP和NGINX和HAPROXY都放到docker里做集群 顶层HAPROXY+KERPALIVE 第二层NGINX+KERPALIVE 第三层APACHE集群+MYSQL集群 第四层docker 第五层LINUX内核 有想法的可以一起讨论下哈