⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 142.cpp

📁 一个自己构造的词法分析器程序,初学者可以用来参考一下
💻 CPP
字号:
//FORTRAN语言编译器---词法分析(C语言简易版) 

/*! @ compiler_CFFX.c 
************************************ 
模块名 : 编译器---词法分析 
文件名 : compiler_CFFX.c 
文件实现功能 : 词法分析 
作者:onlinewanhttp://hi.baidu.com/onlinewan 
版本 : 1.0 
** ******************************** */ 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <malloc.h> 
#include <conio.h> 
#include <stdlib.h>

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 =NULL; 
} 
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=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("<$ID,%s>\n",strToken); 
fputs("<$ID,",fp2); fputs(strToken,fp2); fputs(">\n",fp2); 
} 
else { 
printf("<%c,->\n",code); 
fputs("<",fp2); fputc(code,fp2); fputs(",->\n",fp2); 
} 
} 
else if (IsDigit(ch)) { 
while (IsDigit(ch)) { 
Concat(strToken,&ch); 
GetChar(fp1,&ch); 
} 
Retract(fp1,&ch); 
printf("<$INT,%s>\n",strToken); 
fputs("<$INT,",fp2); fputs(strToken,fp2); fputs(">\n",fp2); 
} 
else if (ch == '=') { 
printf("<$ASSIGN,->\n"); 
fputs("<$ASSIGN,->\n",fp2); 
} 
else if (ch == '+') { 
printf("<$PLUS,->\n"); 
fputs("<$PLUS,->\n",fp2); 
} 
else if (ch == '*') { 
GetChar(fp1,&ch); 
if (ch == '*') { 
printf("<$POWER,->\n"); 
fputs("<$POWER,->\n",fp2); 
} 
else { 
Retract(fp1,&ch); 
printf("<$STAR,->\n"); 
fputs("<$STAR,->\n",fp2); 
} 
} 
else if (ch == ';') { 
printf("<$SEMICOLON,->\n"); 
fputs("<$SEMICOLON,->\n",fp2); 
} 
else if (ch == '(') { 
printf("<$LPAR,->\n"); 
fputs("<$LPAR,->\n",fp2); 
} 
else if (ch == ')') { 
printf("<$RPAR,->\n"); 
fputs("<$RPAR,->\n",fp2); 
} 
else if (ch == '{') { 
printf("<$LBRACE,->\n"); 
fputs("<$LBRACE,->\n",fp2); 
} 
else if (ch == '}') { 
printf("<$RBRACE,->\n"); 
fputs("<$RBRACE,->\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_CFFX input.txt 

输出文件(out.txt)内容: 
<$LBRACE,-> 
<$RBRACE,-> 
<1,-> 
<$SEMICOLON,-> 
<2,-> 
<$LPAR,-> 
<$ID,I> 
<$ASSIGN,-> 
<$INT,0> 
<$SEMICOLON,-> 
<$ID,I> 
<$INT,10> 
<$SEMICOLON,-> 
<$ID,I> 
<$ASSIGN,-> 
<$ID,I> 
<$PLUS,-> 
<$INT,1> 
<$RPAR,-> 
<$LBRACE,-> 
<$RBRACE,-> 
<3,-> 
<$SEMICOLON,->

  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -