简单的词法分析小程序

实验:词法分析

一.实验目的:编写一个词法分析

实验要求:输入:源程序字符串

输出:二元组(种别,单词本身)

二.词法分析程序设计

词法规则:字母<a|b|c|...|z>

数字<0|1|2|...|9>

整数常数:<数字>

标识符:<变量〉

关键字:<main|scanf|printf|...|const>

运算符:<+|-|*|...|:=>

界符   :<(|)|,|;|.>

各单词对应的种别码

三:源代码展示

  1 #include<stdio.h>
  2 #include<malloc.h>
  3 #include<stdlib.h>
  4 #include<ctype.h>
  5 typedef struct node
  6 {
  7     char ch;
  8     struct node *next;
  9 }QNode,*QueuePtr;
 10
 11 typedef struct
 12 {
 13     QueuePtr front;
 14     QueuePtr rear;
 15 }LinkQueue;
 16
 17 LinkQueue Q;
 18 QueuePtr p;        //定义一个指针变量
 19 char *keyword[30]={"main","scanf","printf","void","int","float","double","char","long","short","signed",
 20                "struct","do","while","for","switch","case","break","continue","if","define","typedef","union",
 21                 "static","sizeof","return","extern","goto","auto","const"};
 22 char *operatornum[6]={"+","-","*","/","++","--"};
 23 char *comparison[8]={"<","<=","=",">",">=","<>","==","!="};
 24 char *interpunction[8]={",",";",":=",".","(",")","{","}"};
 25 char *biaoshifu[6]={"%","$","^","&","_","#"};   //特殊标识符
 26 char *zhushifu[3]={"//","/*","*/"};          //注释符
 27 char *luoji[3]={"&&","||","!"};             //逻辑运算符
 28 char *k="";
 29
 30 void InitQueue()      //初始化一个带节点的空队列
 31 {
 32     Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 33     if(!Q.front)
 34       exit(0);
 35     Q.front->next=NULL;
 36 }
 37 void Printf()
 38 {
 39     QueuePtr p;        //定义一个指针变量
 40     p=Q.front;
 41     while(!(p==Q.rear))
 42     {
 43         p=p->next;
 44         printf("%c",p->ch);
 45     }
 46     printf("\n");
 47 }
 48 void Creat()    //创建队列
 49 {
 50     char ch;
 51     QueuePtr p;
 52     printf("请输入您要分析的字符串");
 53     ch=getchar();
 54     while(ch!=‘@‘)
 55     {
 56         p=(QueuePtr)malloc(sizeof(QNode));
 57         p->ch=ch;
 58         p->next=NULL;
 59         Q.rear->next=p;
 60         Q.rear=p;
 61         ch=getchar();
 62     }
 63 }
 64
 65
 66 int search(char searchstr[],int wordtype)//符号匹配
 67 {
 68     int i;
 69     switch (wordtype)
 70     {
 71         case 1:
 72                printf("你好");
 73             for(i=0;i<30;i++)
 74             {
 75                 if(strcmp(keyword[i],searchstr)==0)
 76                 return i;
 77             }
 78             break;
 79         case 2:
 80             for(i=0;i<=5;i++)
 81             {
 82                 if(strcmp(operatornum[i],searchstr)==0)
 83                 return 30+i;
 84             }
 85          break;
 86
 87         case 3:
 88             for(i=0;i<=7;i++)
 89             {
 90              if(strcmp(comparison[i],searchstr)==0)
 91                 return 36+i;
 92             }
 93             break;
 94
 95         case 4:
 96             for(i=0;i<=7;i++)
 97             {
 98                 if(strcmp(interpunction[i],searchstr)==0)
 99                 return 44+i;
100             }
101
102             break;
103         case 5:
104             for(i=0;i<=5;i++)
105             {
106                 if(strcmp(biaoshifu[i],searchstr)==0)
107                     return 52+i;
108             }
109             break;
110         case 6:
111              for(i=0;i<=2;i++)
112              {
113                 if(strcmp(zhushifu[i],searchstr)==0)
114                     return 58+i;
115             }
116             break;
117         case 7:
118             for(i=0;i<=2;i++)
119             {
120                 if(strcmp(luoji[i],searchstr)==0)
121                     return 61+i;
122             }
123         break;
124     }
125
126     return 0;
127 }
128 void Analyze()
129 {
130     char str;
131     char letter[20];
132     char num[20];
133     char other[20];
134     int i;
135     p=Q.front;
136     while(p!=Q.rear)
137     {
138
139         p=p->next;        //获取单个字符
140         str=p->ch;
141         if (isalpha(str)!=0)        //如果是字符
142         {
143             i=-1;
144            while (isalnum(str)!=0)
145           {
146             letter[++i]=str;
147             str=p->next->ch;
148           }
149            letter[i+1]=‘\0‘;
150            if (search(letter,1))
151           {
152             printf("( %d,%s )",search(letter,1),letter);
153
154           }
155           else
156           {
157               printf("( %d,%s )\n",65,letter);
158            }
159         }
160         else
161         {
162             if (isdigit(str)!=0)
163             {
164                 i=-1;
165                 while (isdigit(str)!=0)
166                 {
167                    num[++i]=str;
168                    str=p->next->ch;
169                 }
170                 if(isalpha(str)!=0)         //数字后面是字符
171                 {
172                     while(isspace(str)==0)
173                    {
174                      num[++i]=str;
175                      str=p->next->ch;
176                     }
177                    num[i+1]=‘\0‘;
178                    printf("错误!非法标识符:%s\n",num);
179
180                 }
181                 num[i+1]=‘\0‘;
182                 printf("( %d,%s )",64,num);
183             }
184             else
185             {
186               i=-1;
187               if (isspace(str)!=0)
188               {
189                  str=p->next->ch;
190
191               }
192               while ((isspace(str)==0)&&(isalnum(str)==0))
193               {
194                  other[++i]=str;
195                  str=p->next->ch;
196                }
197                   other[i+1]=‘\0‘;
198               if (search(other,2))
199                   printf("( %d,%s )\n",search(other,2),other);
200               else if (search(other,3))
201                   printf("( %d,%s )\n",search(other,3),other);
202               else if (search(other,4))
203                   printf("( %d,%s )\n",search(other,4),other);
204               else if (search(other,5))
205                   printf("( %d,%s )\n",search(other,5),other);
206               else if (search(other,6))
207                   printf("( %s,注释符号 )\n",other);
208               else if (search(other,7))
209                   printf("( %d,%s )\n",search(other,7),other);
210               else
211                   printf("错误!非法字符:%s\n",other);
212             }
213         }
214     };
215      printf("词法分析结束,谢谢使用!\n");
216 }
217
218 int main()
219 {
220
221     InitQueue();    //创建空链队列
222     Creat();        //创建队列
223     Printf();       //输出队列
224     Analyze();      //词法分析
225     return 0;
226 }
时间: 2024-08-08 09:32:07

简单的词法分析小程序的相关文章

简单的购物车小程序

1 # -*- coding:utf-8 -*- #简单的购物车小程序 author:李学松 2 shopping_cart =[] 3 product_list_tatol = "---product list----" 4 welcome = "-----------welcome to shopping marketi----------" 5 product_list = [ 6 ('iphone',5800), 7 ('lenovo',900), 8 ('

java学习的一些预备知识和一些简单的java小程序

1先了解一些基本的dos命令 dir     ·列出当前目录下的文件和文件夹 md      创建文件夹 rd        删除文件夹(文件下没有子文件) del "文件夹名"    可以删除带子文件的文件夹 cd..    使文件夹目录一层一层后退 cd\    回到根目录 haha>1.txt    创建文档,并将haha写入到1.txt文档中 del 1.txt    删除文件(不走回收站) del  *.txt    只删除txt文件 exit    退出命令行 set

在VR中模拟用鼠标操作电脑并实现简单画图的小程序

(图没有录好,明天换一下) 一.概述 1.实现的基本操作是: 1)用手柄抓住黄色的方块代表手抓住鼠标. 2)通过移动手柄模拟鼠标移动,电脑屏幕上的光标跟着移动. 3)当光标移动到一个Button上时,Button高亮,离开时Button取消高亮,点击Button触发点击事件. 4)当点击Button之后,打开一个画图程序,可以用光标在颜色选择区选择一种颜色,然后在画图区根据光标的移动轨迹,画出选择颜色的光标移动路径的曲线: 2.脚本 1)ComputerController挂在代表电脑的Canv

python实现简单的数学小程序

冒泡法排列list利用打标记来优化 避免重复循环杨辉三角形process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" alt="python实现简单的数学小程序" />建立二维列表,if判定打印出第一个与最后一个1,其余利用列表索引计算与上图类似将每一行列表尾部补0,利用负索引 直接

2015.11.27初识java一集简单的java小程序

今天是来到汉企第二天,昨天主要学习了JAVA配置环境变量方法:1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME变量值:D:\Java\jdk1.7.0_60_x64(变量值必须为全英文路径,不能有中文) 变量名:CLASSPATH变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(完全复制即可)3. 选择“系统变量”中变量名为“Path”的环境变量,双击该

Linux下简单C语言小程序的反汇编分析

韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOOC相关课程而写的作业,如有疏漏,还请指出. 选了一门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这里写下一个对一个简单C命令行程序的反汇编分析过程,一方面完成作业,另一方面当作练手.下面开始: 1.编写我们的C语言小程序 这里我们使用简单的例子,代码如下: 1

python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序

socket介绍: socket(简称套接字),是进程间通讯的一个工具,他能实现把数据从一方传输到另一方,完成不同电脑上进程之间的通讯,它好比数据的搬运工.socket应用:不夸张来说,只要跟网络相关的应用程序或者软件都使用到了socket, 比如:微信,qq等使用socket创建udp网络程序的流程:1,创建客户端套接字2,发送/接收数据3,关闭套接字使用程序展现流程 :(使用的 ide为pycharm):1,首先创建socket,在 Python 中 使用socket 模块的函数 socke

MongoDB API - 简单的示例小程序

阅读群体:对MOngoDB 尚且不够熟悉的初学者. Plus: 由于本ID是第一次使用MongoDB,如出现理解的偏差,还请指出. 1 些概念: 一个MongoDB服务可以建立多个数据库,每一个数据库可以有多张表,通常而言,我们的数据库的表的名字叫 Collection,每一个Collection可以存放多个Document,每一个文档都以BSON(binary)的形式存放在硬盘之中, 因此可以存放比较复杂的形式存放在硬盘之中,因此可以存放比较复杂的对象,它是以文档的形式进行存储的.你可以给 任

用java实现简单的聊天小程序

该小程序目前还不具有对话功能,只有最基本的登录,显示聊天记录的功能 //登录界面import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JButton;import javax.swing.JTextField;import javax.swing.JPasswordField;import javax.swing.JPanel;import java.awt.GridLayout;import java.aw