PL/0 词法分析器设计 c语言
来源:互联网 发布:电话转接软件 编辑:程序博客网 时间:2024/04/28 10:06
【实验内容】
用C余元编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序风格成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常熟以及界符)输出。
运行效果:
基本思路:
1、读取所有的输入的文本,存入一个二维数组。(数组的宽度固定)
2、对二维数组一行行进行处理
3、对文本进行操作的时候,创建两个临时字符数组,一个存储变量名,一个存储常量。
对某行进行遍历的时候,倘若碰到字母,就读完该单词并存储到临时数组里,进行基本字判断后输出。
光标往后移动该单词的长度后,继续循环。(比如读到的是end,那么我该行的光标就要+3,然后继续循环)
倘若读到数字也是一样,只是不需要判断基本字,所以更为简单。
代码:
#include"stdio.h"#include"string.h"#define lineLength 100 //固定每行的长度#define primLength 10 //读取的字符串的长度(标识符之类)#define numLength 20 //读取的常量的长度//存储基本字char mPrimary[14][20]= {"begin","call","const","do","end","if","odd", "procedure","read","then","var","while","write","xujiajia" };char text[lineLength][lineLength];//存储读到的内容int listLength;//保存读取到的内容的长度void read(){ //把所有的数据读入一个二维字符数组中 for(int i=0,isEnd=0;; i++) { char my[lineLength]; gets(my); for(int j=0; j<lineLength; j++) { text[i][j]=my[j]; //判断数组一行是否结束 if(my[j]=='\0') break; else if(my[j]=='.') { isEnd=1; break; } } if(isEnd) { listLength=i; break; } } //对二维字符数组进行处理 for(int i=0,isEnd=0; i<=listLength; i++) { char prim[primLength];//新建一个字符数组用来存储基本字或者变量名 char num[numLength];//新建一个字符数组用来存储常量 for(int k=0; k<primLength; k++) //清空数组 prim[k]='\0'; for(int k=0; k<numLength; k++) //清空数组 num[k]='\0'; for(int j=0; text[i][j]!='\0'; j++) { if(text[i][j]=='.') { printf(". 界符\n"); isEnd=1; break; } else if(text[i][j]==' ') { continue; } else if(text[i][j]>='a'&&text[i][j]<='z') { for(int k=0; (text[i][j]>='a'&&text[i][j]<='z')||(text[i][j]>='0'&&text[i][j]<='9'); j++,k++) //读入字符串 prim[k]=text[i][j]; j--;//由于用j去判断循环的结束,此处需要回退一个字符 for(int k=0; prim[k]!='\0'; k++) //输出字符串 printf("%c",prim[k]); int ii=0,jj=13;//二分查找,查找是否为基本字 int kk; while(ii<=jj) { kk=(ii+jj)/2; if(strcmp(prim,mPrimary[kk])<=0) jj=kk-1; if(strcmp(prim,mPrimary[kk])>=0) ii=kk+1; } if(ii-1>jj)//搜索成功,确定为基本字 printf(" 基本字\n"); else printf(" 标识符\n"); for(int k=0; prim[k]!='\0'; k++) //清空数组方便下次读入 prim[k]='\0'; } else if(text[i][j]>='0'&&text[i][j]<='9') { for(int k=0; text[i][j]>='0'&&text[i][j]<='9'; j++,k++)//读入数字 num[k]=text[i][j]; j--;//由于用j去判断循环的结束,此处需要回退一个字符 for(int k=0; num[k]!='\0'; k++) //输出数字,并且清空方便下次读入 { printf("%c",num[k]); num[k]='\0'; } printf(" 常量\n"); } else//此处处理“+-*/,#()等” { switch(text[i][j]) { case '<': case '>': case ':': { if(text[i][j+1]=='=') { printf("%c%c 运算符\n",text[i][j],text[i][j+1]); j++; } else { printf("%c 运算符\n",text[i][j]); } break; } case '+': case '-': case '*': case '/': { printf("%c 运算符\n",text[i][j]); break; } case '(': case ')': case ',': case ';': { printf("%c 界符\n",text[i][j]); break; } default: printf("%c 标识符\n",text[i][j]); } } } if(isEnd) break; }}int main(){ read(); return 0;}
2 0
- PL/0 词法分析器设计 c语言
- pl/0词法分析器
- c语言词法分析器
- C语言词法分析器
- 词法分析器 c语言
- C语言词法分析器
- 词法分析器 c 语言
- 词法分析器 c语言
- 编译原理实验一:简单PL/0词法分析器C语言代码
- C语言词法分析器源代码
- 【C语言/vs2010】词法分析器
- C语言实现词法分析器
- C语言实现词法分析器
- C语言实现词法分析器
- 类C语言词法分析器的设计--c++实现
- c词法分析器(简易C语言)
- passcal语言的词法分析器设计
- JAVA版 C语言词法分析器
- ionic css 布局
- 【android】 使用观察者模式更新用户资料
- 【超清晰】同步和异步的区别
- 用对象数组操作长方形
- 字符估值器CharEvaluator
- PL/0 词法分析器设计 c语言
- Pandas——ix vs loc vs iloc
- Retrofit
- Objective-C Runtime
- android多线程并发协调semaphore机制
- 自己写一个Web服务器(2)
- 二叉树
- eclipse 启动Tomcat失败(Server Tomcat v7.0 Server at localhost fialed to start)
- iOS热更新-JSPatch实现原理+Patch现场恢复