社区
C语言
帖子详情
求一个词法程序
free1879
2005-12-20 04:53:52
词法分析难度太大,刚学编译原理!看看各位怎么写的...
...全文
114
2
打赏
收藏
求一个词法程序
词法分析难度太大,刚学编译原理!看看各位怎么写的...
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
derekchuang
2005-12-21
打赏
举报
回复
/******************************************************************
*此程序只具备对简单的C语言程序的词法分析,不具备出错处理等高级功能*
*
*
*
*******************************************************************/
#include<stdio.h>
#include<string.h>
FILE *fp;
char ch; //存放最新读进的源程序字符
//将下一个输入字符读到ch中,搜索指示器前移一字符位置
GetChar(){
fscanf(fp,"%c",&ch);
}
//判断ch中的字符是否为空白
int IsEmpty(){
if(ch==' '||ch=='\t'||ch=='\n')
return 1;
else return 0;
}
//判断ch是否为字母
int IsLetter(){
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return 1;
else return 0;
}
//判断ch是否为数字
int IsDigit(){
if(ch>='0'&&ch<='9')
return 1;
else return 0;
}
//判断ch是否为分隔符
int IsCompart(){
if(ch=='('||ch==')'||ch=='{'||ch=='}'||ch==','||ch==';'||ch=='"')
return 1;
else return 0;
}
//判断ch是否为运算符
int IsOperation(){
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='%'||ch=='<'||ch=='>')
return 1;
else return 0;
}
//是否为保留字
int IsKeyWord(char *c){
if(c=="int"||c=="for"||c=="if")
return 1;
else return 0;
}
//初始化单词符号字符串
Init(char *c){
int i;
for(i=0;i<10;i++)
c[i]='\0';
}
main(){
int i=0,j;
char strToken[10]; //存放构成单词符号的字符串
if((fp=fopen("E:\\编译原理\\a.txt","r"))==NULL){
printf("打开文件出错!\n" );
exit(1);
}
GetChar();
for(j=0;ch!='#';j++){
if(IsEmpty()){
while(IsEmpty()){
GetChar();
}
}
if(IsLetter()){
while(IsLetter()||IsDigit()){
strToken[i]=ch;
i++;
GetChar();
}
strToken[i]='\0';
if(IsKeyWord(strToken))
printf("<%s,保留字>\n",strToken);
else
printf("<%s,标识符>\n",strToken);
Init(strToken);
i=0;
}
if(IsCompart()){
while(IsCompart()){
printf("<%c,分隔符>\n",ch);
GetChar();
}
}
if(IsDigit()){
while(IsDigit()){
strToken[i]=ch;
i++;
GetChar();
}
strToken[i]='\0';
printf("%<s,数字>\n",strToken);
Init(strToken);
i=0;
}
if(IsOperation()){
while(IsOperation()){
strToken[i]=ch;
i++;
GetChar();
}
strToken[i]='\0';
printf("<%s,运算符>\n",strToken);
Init(strToken);
i=0;
}
}
getch();
fclose(fp);
}
sankt
2005-12-21
打赏
举报
回复
http://www.08090.com/c/sr/showart.asp?art_id=5&cat_id=2
http://www.qcode.org/article/qcode/code5/cj/cj4/200511/12392.html
其实这方面的例子很多,可以看看上面的参考一下
词法
分析
程序
流程图
词法
分析
程序
流程图
简易C语言
词法
分析
程序
这是学《编译原理》时的上机实验。可实现对C语言的
词法
分析,关键字32个,包含了C的绝大部分运算、限界符,主要是对文件进行读、写操作,节省内存消耗,自以为是
一个
不错的
词法
分析
程序
。运行环境为VC++6.0。
词法
分析
程序
编译原理的源代码,涉及了编译原理的各个过程:
词法
分析,LL1语法分析,语义分析,中?,C-C++,编辑器/阅读器/Editor
编译原理实验报告 语法分析 语义分析
词法
分析 详细的源
程序
附录c 编译
程序
实验 实验目的:用c语言对
一个
简单语言的子集编制
一个
一遍扫描的编译
程序
,以加深对编译原理的理解,掌握编译
程序
的实现方法和技术。 语法分析 C2.1 实验目的 编制
一个
递归下降分析
程序
,实现对
词法
分析
程序
所提供的单词序列的语法检查和结构分析. C2.2 实验要
求
利用C语言编制递归下降分析
程序
,并对简单语言进行语法分析. C2.2.1待分析的简单语言的语法 实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 实验要
求
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 实验的输入和输出 输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。 例如:对于语句串 begin a:=2+3*4;x:=(a+b)/c end# 输出的三地址指令如下: (1) t1=3*4 (2) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思想 1设置语义过程 (1) emit(char *result,char *arg1,char *op,char *ag2) 该函数功能是生成
一个
三地址语句送到四元式表中。 四元式表的结构如下: struct {char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2)char *newtemp() 该函数回送
一个
新的临时变量名,临时变量名产生的顺序为T1,T2,…. Char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } (2)主
程序
示意图如图c.10所示。 (2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。 语义分析
程序
的C语言
程序
框架 int lrparser() { int schain=0; kk=0; if(syn=1) { 读下
一个
单词符号; schain=yucu; /调用语句串分析函数进行分析/ if(syn=6) { 读下
一个
单词符号; if(syn=0 && (kk==0)) 输出(“success”); } else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;} else{输出’begin’错误;kk=1;} } return(schain); int yucu() { int schain=0; schain=statement();/调用语句分析函数进行分析/ while(syn=26) {读下
一个
单词符号; schain=statement(); /调用语句分析函数进行分析/ } return(schain); } int statement() { char tt[8],eplace[8]; int schain=0; {switch(syn) {case 10: strcpy(tt,token); scanner(); if(syn=18) {读下
一个
单词符号; strcpy(eplace,expression()); emit(tt,eplace,””,””); schain=0; } else {输出’缺少赋值号’的错误;kk=1; } return(schain); break; } } char *expression(void) {char *tp,*ep2,*eplace,*tt; tp=(char *)malloc(12);/分配空间/ ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt =(char )malloc(12); strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/ while(syn=13 or 14) { 操作符 tt= ‘+’或者‘—’; 读下
一个
单词符号; strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/ strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/ emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/ strcpy(eplace,tp); } return(eplace); } char *term(void)/仿照函数expression编写/ char *factor(void) {char *fplace; fplace=(char *)malloc(12); strcpy(fplace, “ ”); if(syn=10) {strcpy(fplace,,token);/将标识符token的值赋给fplace/ 读下
一个
单词符号; } else if(syn=11) {itoa(sum,fplace,10); 读下
一个
单词符号; } else if (syn=27) {读下
一个
单词符号; fplace=expression();/调用expression分析返回表达式的值/ if(syn=28) 读下
一个
单词符号; else{输出‘}’错误;kk=1; } } else{输出‘(’错误;kk=1; } return(fplace); }
java
词法
分析器源代码
java
词法
分析器源代码,用eclipse打开就行,免费下载哦,
C语言
70,022
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章