编译原理的作业,使用C手工编写词法简易词法分析器。大概内容就是根据指定的关键字,分隔符和其他的变量等,
在输入的一段程序中,将关键字,分隔符和变量,运算符等分别区分开来放到一个二元组里面,并且说明是第几个。
这个应该是书写编译器的开始,起初感觉很复杂,但是看看Demo还是可以的,下面来看一下源代码。
/* lexical analyzer */
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0
#define MAX_KEY_NUM 10
#define MAX_BORDER_NUM 6
#define MAX_ARITH_NUM 4
#define MAX_RELATION_NUM 6
#define MAX_CONSTS_NUM 20
#define MAX_LABEL_NUM 20
FILE *fp;
char cbuffer;
char *key[MAX_KEY_NUM]={"if","else","for","while","do","return","break","continue","main","int"};
char *border[MAX_BORDER_NUM]={",",";","{","}","(",")"};
char *arithmetic[MAX_ARITH_NUM]={"+","-","*","/"};
char *relation[MAX_RELATION_NUM]={"<","<=","==",">=",">","="};
char *consts[MAX_CONSTS_NUM];
char *label[MAX_LABEL_NUM];
int constnum=0,labelnum=0;
//===============================================
int search(char searchchar[],int wordtype)
{
int i=0;
switch (wordtype) {
case 1:
for (i=0;i<MAX_KEY_NUM;i++)
{
if (strcmp(key[i],searchchar)==0)
return(i+1);
}
case 2:
{for (i=0;i<MAX_BORDER_NUM;i++)
{
if (strcmp(border[i],searchchar)==0)
return(i+1);
}
return(0);
}
case 3:
{for (i=0;i<MAX_ARITH_NUM;i++)
{
if (strcmp(arithmetic[i],searchchar)==0)
{
return(i+1);
}
}
return(0);
}
case 4:
{for (i=0;i<MAX_RELATION_NUM;i++)
{
if (strcmp(relation[i],searchchar)==0)
{
return(i+1);
}
}
return(0);
}
case 5:
{
for (i=0;i<constnum;i++)
{
if(constnum>0)
if (strcmp(consts[i],searchchar)==0)
{
return(i+1);
}
}
consts[i]=(char *)malloc(sizeof(searchchar));
strcpy(consts[i],searchchar);
constnum++;
return(i+1);
}
case 6:
{
for (i=0;i<labelnum;i++)
{
if (strcmp(label[i],searchchar)==0)
{
return(i+1);
}
}
label[i]=(char *)malloc(sizeof(searchchar));
strcpy(label[i],searchchar);
labelnum++;
return(i+1);
}
} // end of switch
}
//===============================================
char alphaprocess(char buffer)
{
int atype;
int i=-1;
char alphatp[20];
while ((isalpha(buffer))||(isdigit(buffer)))
{
alphatp[++i]=buffer;
buffer=fgetc(fp);
}
alphatp[i+1]='\0';
if (atype=search(alphatp,1))
printf("%s (1,%d)\n",alphatp,atype);
else
{
atype=search(alphatp,6);
printf("%s (6,%d)\n",alphatp,atype);
}
return(buffer);
}
//===============================================
char digitprocess(char buffer)
{
int i=-1;
char digittp[20];
int dtype;
while ((isdigit(buffer)))
{
digittp[++i]=buffer;
buffer=fgetc(fp);
}
digittp[i+1]='\0';
dtype=search(digittp,5);
printf("%s (5,%d)\n",digittp,dtype);
return(buffer);
}
//===============================================
char otherprocess(char buffer)
{
int i=-1;
char othertp[20];
int otype,otypetp;
othertp[0]=buffer;
othertp[1]='\0';
if (otype=search(othertp,3))
{
printf("%s (3,%d)\n",othertp,otype-1);
buffer=fgetc(fp);
goto out;
}
if (otype=search(othertp,4))
{
buffer=fgetc(fp);
othertp[1]=buffer;
othertp[2]='\0';
if (otypetp=search(othertp,4))
{
printf("%s (4,%d)\n",othertp,otypetp-1);
goto out;
}
else
othertp[1]='\0';
printf("%s (4,%d)\n",othertp,otype-1);
goto out;
}
if (buffer==':')
{
buffer=fgetc(fp);
if (buffer=='=')
printf(":= (2,2)\n");
buffer=fgetc(fp);
goto out;
}
else
{
if (otype=search(othertp,2))
{
printf("%s (2,%d)\n",othertp,otype-1);
buffer=fgetc(fp);
goto out;
}
}
if ((buffer!='\n')&&(buffer!=' '))
printf("%c error,not a word\n",buffer);
buffer=fgetc(fp);
out: return(buffer);
}
//===============================================
void main()
{
int i;
for (i=0;i<=20;i++)
{
label[i]=NULL;
consts[i]=NULL;
};
if ((fp=fopen("c:\example.c","r"))==NULL)
printf("error");
else
{
cbuffer = fgetc(fp);
while (cbuffer!=EOF)
{
if (isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer);
else if (isdigit(cbuffer))
cbuffer=digitprocess(cbuffer);
else cbuffer=otherprocess(cbuffer);
}
printf("over\n");
getchar();
}
}
这样就算完成了。
分享到:
相关推荐
编译原理 手工编写简易词法分析程序 手工编写简易词法分析程序
编译原理实验课的词法分析器 int SearchKeyWord(){ for(q=0;q;q++){ if(strcmp(strToken,KeyWord[q])==0) return q;//是关键字 if(q==32) return -1;//是字符串 } }
c 编写的 词法分析器c 编写的 词法分析器c 编写的 词法分析器
用C++ 手工编写的词法分析器 结构非常清晰很容易扩展 可以分析大多数C源码的 不支持转义字符 不支持尖括号 当比较运算符处理 . 没有完善的处理 当时做了几个小时头晕了 现在想想 ID 中不包含点就行了 没必要加上...
设计编写调试一个具体的词法分析程序,识别出各个具有独立意义的单词。
java编写的简易词法分析器,主要功能是:当你从文件输入一段c语言代码之后,程序能分析代码结构,解析代码的各种关键字,自定义标识符,数字等。
简易词法分析器 可分析出特出字符 变量名等 也可单步分析
《编译原理》词法分析程序设计方案,用C语言编写的词法分析器!
主要参考资料:《编译原理与实践》Kenneth C.Louden ,机械工业出版的翻译版。Compiler Construction ...词法分析器主要仿照书里面的代码,仿照的意思就是我写代码时会不时的翻翻书。其它代码我是看着屏幕完成的
手工构造的c- c minus语言的词法分析器,适合学习编译原理的同志。
用vb编写的词法分析器,附带关键字说明,源代码
include #include <ctype.h> #include #include "defineclass.h" char TOKEN[20]; char MATCH[NUM][10]={"begin","end","if","then","else"};/*some new key words attached*/ extern int lookup(char* str...
adfadfdsfasdf java编写 c语言词法分析器
1、该词法分析器要求至少能够识别以下几类单词: (1)关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; (2)标识符:识别与C语言词法规定相一致的标识符,通过下列...
词法分析器工作的第一步是输入源程序文本。输入串一般是放在第一个缓冲区中。词法分析的工作可以直接在这个缓冲区中进行。但在许多情况下,把输入串预处理一下,对单词符号的识别工作将比较方便。在设计过程中,使用...
本程序为编译原理及实践课程设计的手工构造词法分析器。包含原代码和文档。
Java简易词法分析器,此分析器将判断出是否为合法字符,界符,保留关键字,数字,标示符等一一解析出来!!
词法分析器(3个不同语言编写的词法分析器)Java的,C++的。。。。 完美运行!
词法分析器 编译原理实验 c语言版
用c语言编写的词法分析器,简单容易理解!