#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
char *key[]={"main","if","then","while","do",
"static","int"," double","struct","break","else","long","switch",
"case","typedef","char","return","const","float","short","continue",
"for","void","default","sizeof","do"};
char GetBC(FILE *fp,char ch){
if(ch==' '||ch=='\n'||ch=='\t')
while((ch=fgetc(fp))==' '||ch=='\n'||ch=='\t');
return ch;
}
char getString(FILE *fp, char ch, char token[]){
int i=0;
token[i]=ch;
while(isalnum(ch=fgetc(fp))){
token[++i]=ch;
}
token[i+1]='\0';
return ch;
}
char getInt(FILE *fp, char ch, char token[]){
int i=0;
token[i]=ch;
while(isdigit(ch=fgetc(fp))){
token[++i]=ch;
}
token[i+1]='\0';
return ch;
}
char scann(FILE *fp, char ch, char token[]){
int i;
if(isalpha(ch)) {
ch=getString(fp,ch,token);
for(i=0;i<26;i++){
if(!strcmp(token,key[i])){
printf("<");
printf("%d,%s",i+1,token);
printf(">\n");
break;
}
}
if(i==26){
printf("<25,");
printf("%s",token);
printf(">\n");
}
}
else if(isdigit(ch)){
ch=getInt(fp,ch,token);
printf("<26,%s>\n",token);
}
else if(ch=='+'){
ch=fgetc(fp);
if(ch=='+')
{
printf("<42,++>\n");
ch=fgetc(fp);
}
else
printf("<27,+>\n");
}
else if(ch=='-'){
ch=fgetc(fp);
if(ch=='-')
printf("<43,-->");
else
printf("<28,->\n");
}
else {
switch(ch){
case '#':printf("<0,#>\n");
break;
case '*':printf("<29,*>\n");
break;
case '/':printf("<30,/>\n");
break;
case '%':printf("<31,%%>\n");
break;
case '{':printf("<32,{>\n");
break;
case '}':printf("<33,}>\n");
break;
case ',':printf("<34,,>\n");
break;
case ';':printf("<35,;>\n");
break;
case '(':printf("<36,(>\n");
break;
case ')':printf("<37,)>\n");
break;
case '<':printf("<38,<>\n");
break;
case '>':printf("<39,>>\n");
break;
case '=':printf("<40,=>\n");
break;
case '.':printf("<41,.>\n");
break;
case '"':printf("<42,\">\n");
break;
case '&':printf("<43,&>\n");
break;
default:printf("error\n");
` break;
}
ch=fgetc(fp);
}
return ch;
}
int main(){
FILE *fp;
char ch=' ';
char filename[20];
scanf("%s",filename);
char token[120];
fp=fopen(filename,"r");
ch=GetBC(fp,ch);
while(ch!=EOF){
ch=scann(fp,ch,token);
ch=GetBC(fp,ch);
}
system("pause");
return 0;
}
#include <ctype.h>
#include <stdlib.h>
char *key[]={"main","if","then","while","do",
"static","int"," double","struct","break","else","long","switch",
"case","typedef","char","return","const","float","short","continue",
"for","void","default","sizeof","do"};
char GetBC(FILE *fp,char ch){
if(ch==' '||ch=='\n'||ch=='\t')
while((ch=fgetc(fp))==' '||ch=='\n'||ch=='\t');
return ch;
}
char getString(FILE *fp, char ch, char token[]){
int i=0;
token[i]=ch;
while(isalnum(ch=fgetc(fp))){
token[++i]=ch;
}
token[i+1]='\0';
return ch;
}
char getInt(FILE *fp, char ch, char token[]){
int i=0;
token[i]=ch;
while(isdigit(ch=fgetc(fp))){
token[++i]=ch;
}
token[i+1]='\0';
return ch;
}
char scann(FILE *fp, char ch, char token[]){
int i;
if(isalpha(ch)) {
ch=getString(fp,ch,token);
for(i=0;i<26;i++){
if(!strcmp(token,key[i])){
printf("<");
printf("%d,%s",i+1,token);
printf(">\n");
break;
}
}
if(i==26){
printf("<25,");
printf("%s",token);
printf(">\n");
}
}
else if(isdigit(ch)){
ch=getInt(fp,ch,token);
printf("<26,%s>\n",token);
}
else if(ch=='+'){
ch=fgetc(fp);
if(ch=='+')
{
printf("<42,++>\n");
ch=fgetc(fp);
}
else
printf("<27,+>\n");
}
else if(ch=='-'){
ch=fgetc(fp);
if(ch=='-')
printf("<43,-->");
else
printf("<28,->\n");
}
else {
switch(ch){
case '#':printf("<0,#>\n");
break;
case '*':printf("<29,*>\n");
break;
case '/':printf("<30,/>\n");
break;
case '%':printf("<31,%%>\n");
break;
case '{':printf("<32,{>\n");
break;
case '}':printf("<33,}>\n");
break;
case ',':printf("<34,,>\n");
break;
case ';':printf("<35,;>\n");
break;
case '(':printf("<36,(>\n");
break;
case ')':printf("<37,)>\n");
break;
case '<':printf("<38,<>\n");
break;
case '>':printf("<39,>>\n");
break;
case '=':printf("<40,=>\n");
break;
case '.':printf("<41,.>\n");
break;
case '"':printf("<42,\">\n");
break;
case '&':printf("<43,&>\n");
break;
default:printf("error\n");
` break;
}
ch=fgetc(fp);
}
return ch;
}
int main(){
FILE *fp;
char ch=' ';
char filename[20];
scanf("%s",filename);
char token[120];
fp=fopen(filename,"r");
ch=GetBC(fp,ch);
while(ch!=EOF){
ch=scann(fp,ch,token);
ch=GetBC(fp,ch);
}
system("pause");
return 0;
}
本文介绍了一个使用C语言编写的简单程序,该程序能够从输入的源文件中识别并打印出预定义的关键字、整数、字符串以及其他符号。通过对字符逐个读取和判断,程序实现了基本的词法分析功能。

2万+

被折叠的 条评论
为什么被折叠?



