| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1448 人关注过本帖
标题:[求助]关于cprintf的用法 急!!!!
只看楼主 加入收藏
diamondlotus
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-4-4
收藏
 问题点数:0 回复次数:0 
[求助]关于cprintf的用法 急!!!!

下面是一个c的词法分析程序,用dev-c++编译老是有一个关于cprintf的错误,有没有谁告诉我怎么回事。谢谢了!!!!!!!!! 编译结果是54 syntax error before `,' token #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <conio.h> #include <io.h>

#define MAXLENGTH 255 #define _KEY_WORD_END "waiting for your expanding" #define _TAB_LENGTH 4

enum{ _MAIN=1,_INT=2,_CHAR=3,_IF=4,_ELSE=5,_FOR=6,_WHILE=7,_VOID=8,_ID=10,_NUM=20,_ASSIGN=21,_PLUS=22,_MINUS=23,_TIMES=24,_DIVIDE=25,_LPAREN=26,_RPAREN=27,_LBRACKET1=28,_RBRACKET1=29,_LBRACKET2=30,_RBRACKET2=31,_COMMA=32,_COLON=33,_SEMICOLON=34,_LG=35,_LT=36,_ME=37,_LE=38,_EQ=39,_END=1000,_ERROR=-1, }; /*以上所表示的分别是关键字main,int,char,if,else,for,while,void,识别出来的单词,数字(这里只能识别int型的整数),符号==,+,-,*,/,(,),[,]{,},,,!,;,>,>=,<,<=,=,/0,和出错*/

union WORDCONTENT { /*存放识别出来的符号或数字或单词*/ char T1[MAXLENGTH]; int T2; char T3; };

typedef struct WORD { /*识别出来的二元组*/ int syn; union WORDCONTENT value; }WORD;

FILE *sr,*fw; char strSource[1000]; /*用来存放源程序*/ char strOut1[2000]; /*用来存放分析的结果,以便在第二个窗口输出*/ char strOut2[1000]; /*用来存放已分析的代码段,以便在第一个窗口输出*/ char error[20]; int column, row, locate, locateStart,srr; /*srr是open()函数的返回值,见main()函数*/ WORD uWord; /*存放当前分析出的二元组结果*/ char *KEYWORDS[20] = {"main","int","char","if","else","for","while","void", _KEY_WORD_END}; /*以上显示了能够识别的关键字*/

int IsDigit(char ch); /*检查是不是数字*/ int IsChar(char ch); /*检查是不是字母*/ void Tag(char *strSource); /*找到一个单词的结尾*/ int EndOfTag(char *strSource); /*识别该单词*/ int EndOfDigit(void); /*识别该整型数字*/ int Digit(char *strSource); /*检查是不是一串合法数字*/ void Error(int column,int row,char *error); /*出错处理*/ void Start(char *strSource); /*开始识别某个符号或单词或整型数字*/ void PrintWord(WORD uWord); /*输出识别的结果*/ void gotoxy(int x, int y); void window(int left, int top, int right, int bottom); void textbackground(int color); void clrscr(void); unsigned sleep(unsigned seconds); int cprintf(const char *format[,argument,...]);

int main() { long length; column=row=1; locate=locateStart=0; fw=fopen("out.txt","wr"); if((sr=fopen("example.c","r"))==NULL) { printf("Can't open example.c\n"); exit(-1); } srr=open("example.c",O_CREAT); length=filelength(srr); /*将源程序读到strSource中*/ fread(strSource,sizeof(char),length/sizeof(char),sr); fclose(sr); close(srr); gotoxy(38,19); printf("RESULT"); gotoxy(36,1); printf("THE CODE"); while (strSource[locate]) { /*分析源程序*/ Start(strSource); PrintWord(uWord); } fclose(fw); getch(); }

int IsDigit(char ch) { /*检查是不是数字*/ if(ch<='9'&&ch>='0') return 1; else return 0; }

int IsChar(char ch) { /*检查是不是字母*/ if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')) return 1; else return 0; }

void Tag(char *strSource) { /*找到一个单词的结尾*/ locate++; row++; if(IsChar(strSource[locate])||IsDigit(strSource[locate])) { Tag(strSource); } else { EndOfTag(strSource); } return; }

int EndOfTag(char *strSource) { /*识别该单词*/ int loop; uWord.syn=_ID; strncpy(uWord.value.T1,strSource+locateStart,locate-locateStart); uWord.value.T1[locate-locateStart]='\0'; loop=0; while(strcmp(KEYWORDS[loop],_KEY_WORD_END)) { if(!strcmp(KEYWORDS[loop],uWord.value.T1)) { uWord.syn=loop+1; break; } loop++; } return 0; }

int EndOfDigit(void) { /*识别该整型数字*/ uWord.syn=_NUM; return 0; }

int Digit(char *strSource) { /*并检查是不是一串合法数字*/ locate++; row++; if(IsDigit(strSource[locate])) { uWord.value.T2=uWord.value.T2*10+strSource[locate]-'0'; if(!Digit(strSource)) { return(0); } } else if(IsChar(strSource[locate])) { /*如果数字后面紧跟一个字母,出错*/ return(0); } else { EndOfDigit(); } return(1); }

void Error(int column,int row,char *error) { /*出错处理*/ int i,j,k,l,m; m=strlen(error); i=j=k=l=0; fprintf(fw,"\n无法识别>Col:%d Row:%d char:%s",column,row,error); fclose(fw); /*将识别结果写到OUT.txt文件中*/ fw=fopen("out.txt","r"); while (!feof(fw)) { /*将全部的识别结果读到strOut1中,以便 在RESULT窗口中输出*/ strOut1[i++]=getc(fw); if(strOut1[i-1]=='\n') { strOut1[i++]='\r'; } } strOut1[i-1]='\0'; fclose(fw); fw=fopen("out.txt","a+"); while(j<=(locate+l-m)) { /*将源程序中正确的读到strOut2中*/ strOut2[j++]=strSource[k++]; if(strOut2[j-1]=='\n') { strOut2[j++]='\r'; l++; } } strOut2[j]='\0'; window(10, 20, 70, 25); textbackground(2); clrscr(); cprintf("%s\r",strOut1); /*用蓝色在RESULT窗口中输出识别结果*/ window(20, 3, 60, 18); textbackground(2); clrscr(); cprintf("%s",strOut2); /*用蓝色在THE CODE窗口中输出源程序中正确的*/ textbackground(7); cprintf("%s",error); /*用红色在THE CODE窗口中输出源程序中错误的*/ sleep(1); /*暂停1秒*/ return; }

void Start(char *strSource) { /*开始识别某个符号或单词或整型数字*/ int locate1,row1,i,m; m=0; locateStart=locate; switch(strSource[locate]) { case '+': { uWord.syn=_PLUS; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '-': { uWord.syn=_MINUS; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '*': { uWord.syn=_TIMES; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '/': { uWord.syn=_DIVIDE; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '(': { uWord.syn=_LPAREN; uWord.value.T3=strSource[locate]; locate++; row++; break; } case ')': { uWord.syn=_RPAREN; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '[': { uWord.syn=_LBRACKET1; uWord.value.T3=strSource[locate]; locate++; row++; break; } case ']': { uWord.syn=_RBRACKET1; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '{': { uWord.syn=_LBRACKET2; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '}': { uWord.syn=_RBRACKET2; uWord.value.T3=strSource[locate]; locate++; row++; break; } case ':': { uWord.syn=_COLON; uWord.value.T3=strSource[locate]; locate++; row++; break; } case ',': { uWord.syn=_COMMA; uWord.value.T3=strSource[locate]; locate++; row++; break; } case ';': { uWord.syn=_SEMICOLON; uWord.value.T3=strSource[locate]; locate++; row++; break; } case '>': { if(strSource[locate+1]!='=') { /*识别>*/ uWord.syn=_LG; uWord.value.T3=strSource[locate]; } else { /*识别>=*/ locate++; row++; uWord.syn=_ME; strcpy(uWord.value.T1,">="); } locate++; row++; break; } case '<': { if(strSource[locate+1]!='=') { /*识别<*/ uWord.syn=_LT; uWord.value.T3=strSource[locate]; } else { /*识别<=*/ locate++; row++; uWord.syn=_LE; strcpy(uWord.value.T1,"<="); } locate++; row++; break; } case '=': { if(strSource[locate+1]!='=') { /*识别=*/ uWord.syn=_ASSIGN; uWord.value.T3=strSource[locate]; } else { /*识别==*/ locate++; row++; uWord.syn=_EQ; strcpy(uWord.value.T1,"=="); } locate++; row++; break; } case '\0': { uWord.syn=_END; uWord.value.T3=strSource[locate]; locate++; row++; break; } default: { if(IsChar(strSource[locate])) { /*识别单词的处理*/ Tag(strSource); } else if(IsDigit(strSource[locate])) { /*识别数字的处理*/ uWord.value.T2=strSource[locate]-'0'; locate1=locate; row1=row; i=Digit(strSource); if(i==0) { /*如果该数字非法,进行出错处理*/ locate++; while(IsChar(strSource[locate])|| IsDigit(strSource[locate])) { locate++; } while(locate1<locate) { /*将非法数字拷贝到error中*/ error[m++]=strSource[locate1]; locate1++; } error[m]='\0'; locate--; /*由于在进入Digit()前先读了一个字符, 前一个字符才是最后一个错误的字符*/ Error(column,row1,error); locate++; Start(strSource); /*重新开始识别*/ } } else { /*如果是空格、换行、回车、制表符则忽略 如果是别的字符就进行出错处理*/ if(strSource[locate]!=' '&&strSource[locate]!='\t' &&strSource[locate]!='\n'&&strSource[locate]!='\r') { error[m++]=strSource[locate]; error[m]='\0'; Error(column,row,error); } if(strSource[locate]=='\n'||strSource[locate]=='\r') { column++; row=1; } else if(strSource[locate]=='\t') { column+=_TAB_LENGTH; } else { row++; } locate++; Start(strSource); } break; } } return; }

void PrintWord(WORD uWord) { /*输出识别的结果*/ int i,j,k,l; i=j=k=l=0; if(uWord.syn<=_ID||uWord.syn==_ME /*向中OUT.txt中写识别结果*/ ||uWord.syn==_LE||uWord.syn==_EQ) { fprintf(fw,"\n(%d, %s)",uWord.syn,uWord.value.T1); } else if(uWord.syn==_NUM) { fprintf(fw,"\n(%d, %d)",uWord.syn,uWord.value.T2); } else { fprintf(fw,"\n(%d, %c)",uWord.syn,uWord.value.T3); } fclose(fw); fw=fopen("out.txt","r"); while (!feof(fw)) { /*将全部的识别结果读到strOut1中,以便 在RESULT窗口中输出*/ strOut1[i++]=getc(fw); if(strOut1[i-1]=='\n') { strOut1[i++]='\r'; } } strOut1[i-1]='\0'; fclose(fw); fw=fopen("out.txt","a+"); while(j!=locate+l) { /*将已经识别的源程序读到strOut2中*/ strOut2[j++]=strSource[k++]; if(strOut2[j-1]=='\n') { strOut2[j++]='\r'; l++; } } strOut2[j]='\0'; window(10, 20, 70, 25); textbackground(2); clrscr(); cprintf("%s\r",strOut1); /*将全部的识别结果输出到RESULT窗口中*/ window(20, 3, 60, 18); textbackground(2); clrscr(); cprintf("%s",strOut2); /*将已经识别的源程序输出到THE CODE窗口中*/ sleep(1); return; }

搜索更多相关主题的帖子: cprintf 用法 
2005-04-04 21:39
快速回复:[求助]关于cprintf的用法 急!!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016900 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved