资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

C语言scaner函数 r scan函数

在调试C程序时出现'scaner' : undeclared identifier怎么修改

scaner改为scanf

目前创新互联已为1000+的企业提供了网站建设、域名、雅安服务器托管、网站托管维护、企业网站设计、大竹网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

如果是自己定义的函数,需要有具体的代码。

编译原理实验“C语言”检查某段C源程序中,标识符的使用是否正确,即是否先声明后使用,或

#include "stdio.h" /*定义I/O库所用的某些宏和变量*/

#include "string.h" /*定义字符串库函数*/

#include "conio.h" /*提供有关屏幕窗口操作函数*/

#include "ctype.h" /*分类函数*/

char prog[80]=,

token[8]; /*存放构成单词符号的字符串*/

char ch;

int syn, /*存放单词字符的种别码*/

n,

sum, /*存放整数型单词*/

m,p; /*p是缓冲区prog的指针,m是token的指针*/

char *rwtab[6]=;

void scaner(){

m=0;

sum=0;

for(n=0;n8;n++)

token[n]='\0';

ch=prog[p++];

while(ch==' ')

ch=prog[p++];

if(isalpha(ch)) /*ch为字母字符*/{

while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='\0';

ch=prog[p--];

syn=10;

for(n=0;n6;n++)

if(strcmp(token,rwtab[n])==0) /*字符串的比较*/{

syn=n+1;

break;}}

else

if(isdigit(ch)) /*ch是数字字符*/{

while(isdigit(ch)) /*ch是数字字符*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

case'':m=0;token[m++]=ch;ch=prog[p++];

if(ch==''){

syn=21;

token[m++]=ch;}

else if(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

case'':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf("\n\nThe significance of the figures:\n"

"1.figures 1 to 6 said Keyword\n"

"2.figures 10 and 11 said Other indicators\n"

"3.figures 13 to 28 said Operators\n");

p=0;

printf("\nplease input string:\n");

do {

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case 11: printf("(%d,%d)\n",syn,sum);break;

case -1: printf("\n ERROR;\n");break;

default: printf("(%d,%s)\n",syn,token);

}

}while(syn!=0);

getch();

}

程序测试结果

对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下图5-1所示:

具体的你在修改修改吧

做一个简单的词法分析器, 一:要求能识别C程序中的部分关键字 int, char ,float if,else main, prin

时间:2012-10-30 晚

要求:输入一串字符串,对其进行词法分析,并且按照(种别,字符串/数字)格式进行输出

种别编码:

符号 种别 符号 种别 符号 种别

begin 1 + 13 = 22

if 2 - 14 23

then 3 * 15 = 24

while 4 / 16 = 25

do 5 : 17 ; 26

end 6 := 18 ( 27

l(l|d)* 10 20 ) 28

数字① 11 21 # 0

①数字的词法正规式如下:( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε)

ps:输入的字符串以“#”结尾

运行环境:VC++6.0

说明:搜索网上的资源,大部分的“数字”部分都是dd*形式,但这次试验要求的是①形式,因而在数字部分做了很大努力。与dd*形式的不同有三个地方——ch是数字时,ch是+后接着是数字形式,ch是-后接着是数字形式。然而由于水平有限,时间较短,每个“加号”或“减号”后必须要在输入数字正负符号,否则会默认“+”“-”为正负符号而不是“加号”“减号”。希望能有简单方法解决这个问题。

源代码:

#include stdio.h //定义I/O库所用的某些宏和变量

#include string.h //定义字符串库函数

#include math.h //定义数学运算符号库函数

char prog[80],token[8]; //prog:缓冲区;token:一个有意义的字符串

char ch; //ch:当前处理的字符

int syn,p,m,n,f,e;

//syn:类别;p,m,n:计数变量;f,标记数字正负;e,10的次方数

double sum; //sum,数字

char *rwtab[6]={"begin","if","then","while","do","end"};

//基本字表置初值

void main(void) //主函数

{

void scaner(void); //声明函数

p=0;

printf("\n请输入字符串:\n");

do{ //输入的字符放入缓冲区

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{ //分析词法并输出结果

scaner();

switch(syn)

{

case 11:printf("(%2d,%16g)\n",syn,sum);break;

case -1:printf("输入错误\n");break;

default:printf("(%2d,%16s)\n",syn,token);

}

}while(syn!=0);

}

void scaner(void)

{

for(n=0;n8;n++) //token初始化

token[n]=NULL;

ch=prog[p++];

while(ch==' ') //如果取消空字符(目前空字符只包括空格)

ch=prog[p++];

if((ch='a'ch='z')||(ch='A'ch='Z'))

//如果ch是字母字符

{

m=0;

while((ch='a'ch='z')||(ch='A'ch='Z')||(ch='0'ch='9'))

//如果ch是字母字符或数字字符

{

token[m++]=ch;

ch=prog[p++]; //读下一个字符

}

token[m++]='\0';

p--;

syn=10;

for(n=0;n6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1; //给出syn值

break;

}

}

else if(ch='0'ch='9') //数字(1)

{

sum=0;

while(ch='0'ch='9')

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

if(ch=='.') //有小数点

{

e=-1;

ch=prog[p++];

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

sum=sum+(ch-'0')*pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

e=e*10+ch-'0';

ch=prog[p++];

}

}

e=e*f;

sum=sum*pow(10,e);

}

p--;

syn=11;

}

else switch(ch)

{

case '':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='') //

{

syn=21;

token[m++]=ch;

}

else if(ch=='=') //=

{

syn=22;

token[m++]=ch;

}

else //

{

syn=20;

p--;

}

break;

case '':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='=') //=

{

syn=24;

token[m++]=ch;

}

else //

{

syn=23;

p--;

}

break;

case ':':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='=') //:=

{

syn=18;

token[m++]=ch;

}

else //:

{

syn=17;

p--;

}

break;

case '+':

ch=prog[p++];

if(ch='0'ch='9') //数字(2)

{

sum=0;

while(ch='0'ch='9')

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

if(ch=='.') //有小数点

{

e=-1;

ch=prog[p++];

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

sum=sum+(ch-'0')*pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

e=e*10+ch-'0';

ch=prog[p++];

}

}

e=e*f;

sum=sum*pow(10,e);

}

p--;

syn=11;

}

else //+

{

syn=13;

p--;

ch=prog[p-1];

token[0]=ch;

}

break;

case '-':

ch=prog[p++];

if(ch='0'ch='9') //数字(3)

{

sum=0;

while(ch='0'ch='9')

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

if(ch=='.') //有小数点

{

e=-1;

ch=prog[p++];

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

sum=sum+(ch-'0')*pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch='0'ch='9')

{

while(ch='0'ch='9')

{

e=e*10+ch-'0';

ch=prog[p++];

}

}

e=e*f;

sum=sum*pow(10,e);

}

sum=-sum;

p--;

syn=11;

}

else //-

{

syn=13;

p--;

ch=prog[p-1];

token[0]=ch;

}

break;

case '*': syn=15;token[0]=ch;break;

case '/': syn=16;token[0]=ch;break;

case '=': syn=25;token[0]=ch;break;

case ';': syn=26;token[0]=ch;break;

case '(': syn=27;token[0]=ch;break;

case ')': syn=28;token[0]=ch;break;

case '#': syn=0;token[0]=ch;break;

default: syn=-1;

}

}

试试吧

急(高悬赏 帮个忙) 求编译原理课程设计---c语言实现c-的语法分析,在线等

新建一个文本文档在你工程目录下,名字起为"输入.txt",里面的内容可以为

begin a:=1+7*(6+3);b:=1end#

输出是在"输出.txt"中查看,以下为输出情况:

词法分析结果如下:

(1, begin)

(10, a)

(18, :=)

(11, 1)

(13, +)

(11, 7)

(15, *)

(27, ()

(11, 6)

(13, +)

(11, 3)

(28, ))

(26, ;)

(10, b)

(18, :=)

(11, 1)

(6, end)

(0, #)

语法分析结果如下:(以四元式形式输出)

( +, 6, 3, t1)

( *, 7, t1, t2)

( +, 1, t2, t3)

( =, t3, __, a)

( =, 1, __, b)

//提供一个编译原理的语义分析程序 你可以直接复制 用TC进行调试

#include "stdio.h"

#include "string.h"

#include malloc.h

#include conio.h

#include "stdlib.h"

char prog[100],token[8],ch;

char *rwtab[6]={"begin","if","then","while","do","end"};

int syn,p,m,n,sum,q;

int kk;

//四元式表的结构如下:

struct

{

char result1[8];

char ag11[8];

char op1[8];

char ag21[8];

}quad[20];

char *factor();

char *expression();

int yucu();

char *term();

int statement();

int lrparser();

char *newtemp();

void scaner();

void emit(char *result,char *ag1,char *op,char *ag2);

void main()

{

FILE *fp1,*fp2;

if((fp1=fopen("输入.txt","rt"))==NULL)

{

printf("Cannot open 输入.txt\n");

getch();

exit(1);

}

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

{

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

getch();

exit(1);

}

int j;

q=p=kk=0;

p=0;

//printf("Please Input a String(end with '#'):\n");

while(ch!='#')

{

ch = fgetc(fp1);

if(ch == EOF)

{

printf("文件为空,请检查后再尝试!");

return ;

}

prog[p++]=ch;

}

if(prog[p]=='#')

{

printf("输入的待分析的串不是以'#'结尾,请修改之后再尝试!\n");

return;

}

p=0;

char buffer1[200] = {0};

sprintf(buffer1,"词法分析结果如下:\n");

fputs(buffer1,fp2);

//printf("词法分析结果如下:\n");

do

{

scaner();

switch(syn)

{

case 11:

//printf("(%d,%d)\n",syn,sum);

sprintf(buffer1,"(%d, %d) \n",syn,sum);

fputs(buffer1,fp2);

break;

default:

//printf("(%d,%s)\n",syn,token);

sprintf(buffer1,"(%d, %s)\n",syn,token);

fputs(buffer1,fp2);

break;

}

}while(syn!=0);

printf("\n");

p=0;

char buffer[200]={0};

sprintf(buffer,"语法分析结果如下:(以四元式形式输出)\n");

fputs(buffer,fp2);

//printf("语法分析结果如下:(以四元式形式输出)\n");

scaner();//扫描函数

lrparser();

if(q19)

printf(" to long sentense!\n");

else

{

for (j=0;jq;j++)

{

//printf("( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);

sprintf(buffer,"( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);

fputs(buffer,fp2);

}

}

printf("已把相应的词法和语法的结果保存到相应的文件中,请查阅!\n");

fclose(fp1);

fclose(fp2);

}

int lrparser()

{

int schain=0;

kk=0;

if (syn==1) //得到begin

{

scaner();//扫描下个字符

schain=yucu();

if(syn==6)//得到end

{

scaner();//扫描下个字符

if((syn==0)(kk==0)) //得到#

printf("Success!\n");

}

else

{

if(kk!=1)

printf("short of 'end' !\n");

kk=1;

getch();

exit(0);

}

}

else

{

printf("short of 'begin' !\n");

kk=1;

getch();

exit(0);

}

return (schain);

}

int yucu()

{

int schain=0;

schain=statement();

while(syn==26)

{

scaner();

schain=statement();

}

return (schain);

}

int statement()

{

char tt[8],eplace[8];

int schain=0;

if (syn==10)

{

strcpy(tt,token); //tt中保存的是第一个字符

scaner();

if(syn==18) //检测到=号

{

scaner();

strcpy(eplace,expression());

emit(tt,eplace,"=","__");

schain=0;

}

else

{

printf("short of sign ':=' !\n");

kk=1;

getch();

exit(0);

}

return (schain);

}

}

char *expression()

{

char *tp,*ep2,*eplace,*tt;

tp=(char *)malloc(12);

ep2=(char *)malloc(12);

eplace=(char *)malloc(12);

tt=(char *)malloc(12);

strcpy(eplace,term());

while((syn==13)||(syn==14))

{

if (syn==13)

strcpy(tt,"+");

else

strcpy(tt,"-");

scaner();

strcpy(ep2,term());

strcpy(tp,newtemp());

emit(tp,eplace,tt,ep2);

strcpy(eplace,tp);

}

return (eplace);

}

char *term()

{

char *tp,*ep2,*eplace,*tt;

tp=(char *)malloc(12);

ep2=(char *)malloc(12);

eplace=(char *)malloc(12);

tt=(char *)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))

{

if (syn==15)

strcpy(tt,"*");

else

strcpy(tt,"/");

scaner();

strcpy(ep2,factor());

strcpy(tp,newtemp());

emit(tp,eplace,tt,ep2);

strcpy(eplace,tp);

}

return (eplace);

}

char *factor()

{

char *fplace;

fplace=(char *)malloc(12);

strcpy(fplace,"");

if(syn==10) //得到字符

{

strcpy(fplace,token);

scaner();

}

else if(syn==11) //得到数字

{

itoa(sum,fplace,10);

scaner();

}

else if(syn==27) //得到)

{

scaner();

fplace=expression();

if(syn==28) //得到(

scaner();

else

{

printf("error on ')' !\n");

kk=1;

getch();

exit(0);

}

}

else

{

printf("error on '(' !\n");

kk=1;

getch();

exit(0);

}

return (fplace);

}

//该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2...

char *newtemp()

{

char *p;

char m[8];

p=(char *)malloc(8);

kk++;

itoa(kk,m,10);

strcpy(p+1,m);

p[0]='t';

return(p); //设置中间变量名放在一个字符数组中,字符数组的第一个字符为t第二个字符为m表示的数值

}

void scaner()

{

sum=0;

///for(m=0;m8;m++)

//token[m++]=NULL;

memset(token,0,8);

m=0;

ch=prog[p++];

while(ch==' ')

ch=prog[p++];

if(((ch='z')(ch='a'))||((ch='Z')(ch='A')))

{

while(((ch='z')(ch='a'))||((ch='Z')(ch='A'))||((ch='0')(ch='9')))

{

token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

token[m++]='\0';

for(n=0;n6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1;

break;

}

}

else if((ch='0')(ch='9'))

{

while((ch='0')(ch='9'))

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=11;

}

else switch(ch)

{

case '':m=0;

ch=prog[p++];

if(ch=='')

{

syn=21;

}

else if(ch=='=')

{

syn=22;

}

else

{

syn=20;

p--;

}

break;

case '':m=0;

ch=prog[p++];

if(ch=='=')

{

syn=24;

}

else

{

syn=23;

p--;

}

break;

case ':':m=0;

token[m++] = ch;

ch=prog[p++];

if(ch=='=')

{

syn=18;

token[m++] = ch;

}

else

{

syn=17;

p--;

}

break;

case '+': syn=13;token[0] = ch; break;

case '-': syn=14;token[0] = ch; break;

case '*': syn=15;token[0] = ch;break;

case '/': syn=16;token[0] = ch;break;

case '(': syn=27;token[0] = ch;break;

case ')': syn=28;token[0] = ch;break;

case '=': syn=25;token[0] = ch;break;

case ';': syn=26;token[0] = ch;break;

case '#': syn=0;token[0] = ch;break;

default: syn=-1;break;

}

}

//该函数是生成一个三地址语句送到四元式表中

void emit(char *result,char *ag1,char *op,char *ag2)

{

strcpy(quad[q].result1,result);

strcpy(quad[q].ag11,ag1);

strcpy(quad[q].op1,op);

strcpy(quad[q].ag21,ag2);

q++; //统计有多少个四元式

}

编写一个程序,输入一个C语言程序,经词法分析处理,后输出单词记号序列。

#include stdio.h

#include stdlib.h

#include string.h

#define _KEY_WORD_END "waiting for your expanding"

typedef struct

{

int typenum;

char * word;

} WORD;

char input[255];

char token[255]="";

int p_input;

int p_token;

char ch;

char* KEY_WORDS[]={"main","int","char","if","else","for","while",_KEY_WORD_END};

WORD* scaner();

void main()

{

int over=1;

WORD* oneword=new WORD;

printf("Enter Your words(end with $):");

scanf("%[^$]s",input);

p_input=0;

printf("Your words:\n%s\n",input);

while(over1000over!=-1){

oneword=scaner();

if(oneword-typenum1000)

printf("(%d,%s)",oneword-typenum,oneword-word);

over=oneword-typenum;

}

printf("\npress # to exit:");

scanf("%[^#]s",input);

}

char m_getch(){

ch=input[p_input];

p_input=p_input+1;

return (ch);

}

void getbc(){

while(ch==' '||ch==10){

ch=input[p_input];

p_input=p_input+1;

}

}

void concat(){

token[p_token]=ch;

p_token=p_token+1;

token[p_token]='\0';

}

int letter(){

if(ch='a'ch='z'||ch='A'ch='Z')return 1;

else return 0;

}

int digit(){

if(ch='0'ch='9')return 1;

else return 0;

}

int reserve(){

int i=0;

while(strcmp(KEY_WORDS[i],_KEY_WORD_END)){

if(!strcmp(KEY_WORDS[i],token)){

return i+1;

}

i=i+1;

}

return 10;

}

void retract(){

p_input=p_input-1;

}

char* dtb(){

return NULL;

}

WORD* scaner(){

WORD* myword=new WORD;

myword-typenum=10;

myword-word="";

p_token=0;

m_getch();

getbc();

if(letter()){

while(letter()||digit()){

concat();

m_getch();

}

retract();

myword-typenum=reserve();

myword-word=token;

return(myword);

}

else if(digit()){

while(digit()){

concat();

m_getch();

}

retract();

myword-typenum=20;

myword-word=token;

return(myword);

}

else switch(ch){

case '=': m_getch();

if (ch=='='){

myword-typenum=39;

myword-word="==";

return(myword);

}

retract();

myword-typenum=21;

myword-word="=";

return(myword);

break;

case '+': myword-typenum=22;

myword-word="+";

return(myword);

break;

case '-': myword-typenum=23;

myword-word="-";

return(myword);

break;

case '*': myword-typenum=24;

myword-word="*";

return(myword);

break;

case '/': myword-typenum=25;

myword-word="/";

return(myword);

break;

case '(': myword-typenum=26;

myword-word="(";

return(myword);

break;

case ')': myword-typenum=27;

myword-word=")";

return(myword);

break;

case '[': myword-typenum=28;

myword-word="[";

return(myword);

break;

case ']': myword-typenum=29;

myword-word="]";

return(myword);

break;

case '{': myword-typenum=30;

myword-word="{";

return(myword);

break;

case '}': myword-typenum=31;

myword-word="}";

return(myword);

break;

case ',': myword-typenum=32;

myword-word=",";

return(myword);

break;

case ':': myword-typenum=33;

myword-word=":";

return(myword);

break;

case ';': myword-typenum=34;

myword-word=";";

return(myword);

break;

case '': m_getch();

if (ch=='='){

myword-typenum=37;

myword-word="=";

return(myword);

}

retract();

myword-typenum=35;

myword-word="";

return(myword);

break;

case '': m_getch();

if (ch=='='){

myword-typenum=38;

myword-word="=";

return(myword);

}

retract();

myword-typenum=36;

myword-word="";

return(myword);

break;

case '!': m_getch();

if (ch=='='){

myword-typenum=40;

myword-word="!=";

return(myword);

}

retract();

myword-typenum=-1;

myword-word="ERROR";

return(myword);

break;

case '\0': myword-typenum=1000;

myword-word="OVER";

return(myword);

break;

default: myword-typenum=-1;

myword-word="ERROR";

return(myword);

}

}

怎样把图片转换成代码,用于C语言开发的软件中?

图片转换成代码 -- scaner (扫描仪)就是干这个的。

有的三合一打印机(打印机,fax, 扫描仪三合一)也可以干这个。

数码相机也干这个。图片转换成的格式有 jpg,bmp,tif 等等,许多程序和软件都能处理。


网站名称:C语言scaner函数 r scan函数
分享路径:http://cdkjz.cn/article/dodhgep.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220