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函数
本文地址:https://www.cdcxhl.com/article48/dodhgep.html

成都网站建设公司_创新互联,为您提供商城网站网站排名网站设计网站内链定制网站企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发