编译器词法分析c语言,FORTRAN语言编译器---词法分析(C语言简易版)

1.实验题目:词法分析

用高级语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出.输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调用预处理子程序来处理新串.

2.实验目的

1)熟悉词法分析的基本原理,词法分析的过程,以及词法分析中要注意的一些问题。

2)复习高级语言,进一步加强用高级语言来解决实际问题的能力。

3.实验内容

1)程序总控图如下

......

2)实验步骤

1、基于实验的内容,构造程序所需的模块.

2、根据已建构的模块,写出各个模块的相应程序代码.

3、在主函数中调用模块来完成所要得到的效果.

/*! @ compiler_CFFX.c

************************************模块名:编译器---词法分析文件名: compiler_CFFX.c文件实现功能:词法分析作者:onlinewan版本: 1.0

** ******************************** */

#include 

#include 

#include 

#include 

#include 

int IsLetter(char ch)

{/*判断是否是字母,是则返回1,否则返回0*/

if(isalpha(ch))return 1;

return 0;

}

int IsDigit(char ch)

{/*判断是否为数字,是则返回1,否则返回0 */

if(isalnum(ch))return 1;

return 0;

}

int IsSpace(char ch)

{/*判断是否为空白符(空格、换行、制表符等),是则返回1,否则返回0*/

if(isspace(ch))return 1;

return 0;

}

void GetChar(FILE *fp,char *ch)

{/*读取字符送ch*/

*ch = fgetc(fp);

}

void GetBC(FILE *fp,char *ch)

{/*如果是空白则继续读下一个,直到不是空白*/

do {

GetChar(fp,ch);

}while(IsSpace(*ch)&&(*ch != EOF));

}

void Retract(FILE *fp,char *ch)

{/*光标回退一位,并使ch为空*/

fseek(fp,-1,1);

*ch = '';

}

char Reserve(char *strToken)

{/*返回关键字的编码*/

if(strcmp(strToken,"BEGIN") == 0)return '1';

if(strcmp(strToken,"FOR") == 0)return '2';

if(strcmp(strToken,"END") == 0)return '3';

if(strcmp(strToken,"DIM") == 0)return '4';

if(strcmp(strToken,"WHILE") == 0)return '5';

if(strcmp(strToken,"STOP") == 0)return '6';

if(strcmp(strToken,"IF") == 0)return '7';

if(strcmp(strToken,"ELSE") == 0)return '8';

if(strcmp(strToken,"INT") == 0)return '9';

return '0';

}

void Concat(char *strToken, char *ch)

{/*将ch中的字符连接到strToken后面*/

int i;

for(i=0;i<80;i++) {

if(*strToken == NULL) {

*strToken = *ch;

break;

}

strToken++;

}

}

int lexSubFunc(FILE *fp1,FILE *fp2)

{/*词法分析子程序*/

char ch,code;

int i;

char strToken[80];

while(1) {

GetBC(fp1,&ch);

for(i=0;i<80;i++) strToken[i]=NULL;

if(ch == EOF) return 0;

if (IsLetter(ch)){

while (IsLetter(ch) || IsDigit(ch)) {

Concat(strToken,&ch);

GetChar(fp1,&ch);

}

Retract(fp1,&ch);

code = Reserve(strToken);

if (code == '0') {

printf("/n",strToken);

fputs("/n",fp2);

}

else {

printf("/n",code);

fputs("/n",fp2);

}

}

else if (IsDigit(ch)) {

while (IsDigit(ch)) {

Concat(strToken,&ch);

GetChar(fp1,&ch);

}

printf("/n",strToken);

fputs("/n",fp2);

}

else if (ch == '=') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == '+') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == '*') {

GetChar(fp1,&ch);

if (ch == '*') {

printf("/n");

fputs("/n",fp2);

}

else {

Retract(fp1,&ch);

printf("/n");

fputs("/n",fp2);

}

}

else if (ch == ';') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == '(') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == ')') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == '{') {

printf("/n");

fputs("/n",fp2);

}

else if (ch == '}') {

printf("/n");

fputs("/n",fp2);

}

}

} void main(int argc, char *argv[])

{/*主程序*/

FILE *fp1,*fp2;

if(argc==1)

{

printf("have not enter file name. strike any key exit");

getch(); exit(0);

}

if((fp1=fopen(argv[1],"rt"))==NULL)

{

printf("Cannot open %s/n",argv[1]);

getch(); exit(1);

}

if((fp2=fopen("out.txt","wt+"))==NULL)

{

printf("Cannot create out.txt FILE.strike any key exit");

getch(); exit(1);

}

lexSubFunc(fp1,fp2);

fclose(fp1);

fclose(fp2);

}

/*compiler_CFFX.c结束*/ 输入文件(input.txt)内容:

{}BEGIN;

FOR(I=0;I<10;I=I+1){}

END;

程序运行时在命令行下输入:

Compiler_CFFXinput.txt

输出文件(out.txt)内容:

<1,->

<2,->

<3,->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值