📄 javascanner.cpp
字号:
#include <stdio.h>
#include <string.h>
#define max_inbuf 20
#define max_strbuf 100
#define max_filename 30
char strbuf[max_strbuf],inbuf[2][max_inbuf],filename[max_filename];
int buffers,bufcount,backflag=0,line,eline,ecount=0,hcol,ccol,tcol,cnum,tnum,strbufi;
FILE *instream,*outstream;
char itable[50][16]={
"abstract","boolean","break","byte","case","catch","char","class",
"const","continue","default","do","double","else","extends","false",
"final","finally","float","for","goto","if","implements","import",
"instanceof","int","interface","long","native","new","null","package",
"private","protected","public","return","short","static","super","switch",
"synchronized","this","throw","throws","transient","true","try","void",
"volatile","while"};
char nextChar()
{
ccol++;
if (bufcount<max_inbuf)
{
backflag=0;
return inbuf[buffers][bufcount++];
}
else
{
bufcount=0;
if (buffers==0)
{
buffers=1;
}
else
{
buffers=0;
}
if(!backflag)
{
memset(inbuf[buffers],'\0',max_inbuf);
fread(inbuf[buffers],1,max_inbuf,instream);
}
backflag=0;
return inbuf[buffers][bufcount++];
}
}
void backBuf()
{
ccol--;
if (bufcount>0)
{
bufcount--;
}
else
{
if (buffers==0)
{
buffers=1;
}
else
{
buffers=0;
}
bufcount=max_inbuf-1;
backflag=1;
}
}
bool isHeadOfIdentifier(char ch)
{
if (ch=='_'||ch=='$'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
return true;
}
return false;
}
bool isCharOfIdentifier(char ch)
{
if (ch=='_'||ch=='$'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
{
return true;
}
return false;
}
void putcstrbuf(char ch)
{
strbuf[strbufi++]=ch;
}
void changechar()
{
char ch;int i;
ch=nextChar();
if (ch=='b'||ch=='t'||ch=='n'||ch=='f'||ch=='r'||ch=='\\'||ch=='\''||ch=='\"')
{
putcstrbuf(ch);
}
else if (ch>='0'&&ch<='7')
{
putcstrbuf(ch);
for (i=1;i<=2;i++)
{
ch=nextChar();
if (ch>='0'&&ch<='7')
{
putcstrbuf(ch);
}
else
{
backBuf();
break;
}
}
}
else if (ch=='u')
{
putcstrbuf(ch);
ch=nextChar();
if (ch>='0'&&ch<='9'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F')
{
putcstrbuf(ch);
for (i=1;i<=3;i++)
{
ch=nextChar();
if (ch>='0'&&ch<='9'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F')
{
putcstrbuf(ch);
}
else
{
backBuf();
break;
}
}
}
else
{
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
}
else
{
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
}
int main()
{
char ch;int state,i;
printf("Please input the filename:");
scanf("%s",filename);
instream=fopen(filename,"r");
if (instream==NULL)
{
printf("The file is not found!\n");
scanf("%c",&ch);
scanf("%c",&ch);
return 0;
}
buffers=0;
bufcount=0;
fread(inbuf[buffers],1,max_inbuf,instream);
outstream=fopen("scanner_output.txt","w");
line=1;
ccol=0;
cnum=0;
tnum=0;
strbufi=0;
while (ch=nextChar())
{
if (ch=='\r'||ch=='\n'||ch=='\f')
{
line++;
ccol=0;
tnum+=cnum;
cnum=0;
continue;
}
else if(ch=='\t'||ch==' ')
{
continue;
}
else if (isHeadOfIdentifier(ch))
{
hcol=ccol;
putcstrbuf(ch);
while (ch=nextChar())
{
if (isCharOfIdentifier(ch))
{
putcstrbuf(ch);
}
else
{
putcstrbuf('\0');
tcol=ccol-1;
backBuf();
break;
}
}
if (ch=='\0')
{
putcstrbuf('\0');
tcol=ccol-1;
backBuf();
}
}
else if (ch==','||ch==';'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch=='('||ch==')')
{
hcol=ccol;
tcol=ccol;
putcstrbuf(ch);
putcstrbuf('\0');
switch(ch)
{
case ',':fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x120) [%s]\n",line,++cnum,hcol,tcol,strbuf);break;
case ';':fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x122) [%s]\n",line,++cnum,hcol,tcol,strbuf);break;
case '{':
case '}':fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x121) [%s]\n",line,++cnum,hcol,tcol,strbuf);break;
case '[':
case ']':
case '(':
case ')':fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x11d) [%s]\n",line,++cnum,hcol,tcol,strbuf);break;
}strbufi=0;
}
else if (ch=='/')
{
hcol=ccol;
putcstrbuf(ch);
switch(ch=nextChar())
{
case '=':tcol=ccol;putcstrbuf(ch);putcstrbuf('\0');break;
case '/':
while (ch=nextChar())
{
if (ch=='\r'||ch=='\n')
{
strbufi=0;line++;ccol=0;tnum+=cnum;cnum=0;break;
}
}
if (ch=='\0')
{
strbufi=0;backBuf();break;
}
break;
case '*':
eline=line;
while (true)
{
ch=nextChar();
if (ch=='\r'||ch=='\n'||ch=='\f')
{
line++;
ccol=0;
tnum+=cnum;
cnum=0;
}
else if (ch=='*')
{
ch=nextChar();
if (ch=='/')
{
break;
}
else if (ch=='\r'||ch=='\n'||ch=='\f')
{
line++;
ccol=0;
tnum+=cnum;
cnum=0;
}
else if(ch=='\0')
{
backBuf();
}
}
else if (ch=='\0')
{
printf("error%d: %5d-%3d: (%3d-%3d) \'/*\' is a error,need \'*/\'.\n",++ecount,eline,++cnum,hcol,hcol+1);
break;
}
} strbufi=0;break;
default:tcol=ccol-1;putcstrbuf('\0');backBuf();
}
}
else if (ch=='\'')
{
hcol=ccol;
putcstrbuf(ch);
ch=nextChar();
if (ch=='\\')
{
putcstrbuf(ch);
changechar();
if (strbufi==0)
{
continue;
}
else{
ch=nextChar();
if (ch=='\'')
{
putcstrbuf(ch);
tcol=ccol;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x106) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
else
{
backBuf();
tcol=ccol-1;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
}
}
else if(ch!='\\'&&ch!='\''&&ch!='\"'&&ch!='\n'&&ch!='\r'&&ch!='\f'&&ch!='\b'&&ch!='\t')
{
putcstrbuf(ch);
ch=nextChar();
if (ch=='\'')
{
putcstrbuf(ch);
tcol=ccol;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x106) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
else
{
backBuf();
tcol=ccol-1;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
}
else {
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
}
}
else if (ch=='\"')
{
hcol=ccol;
putcstrbuf(ch);
while (true)
{
ch=nextChar();
if (ch=='\\')
{
putcstrbuf(ch);
changechar();
if (strbufi==0)
{
break;
}
}
else if (ch=='\"')
{
putcstrbuf(ch);
tcol=ccol;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x109) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
else if (ch!='\\'&&ch!='\''&&ch!='\"'&&ch!='\n'&&ch!='\r'&&ch!='\f'&&ch!='\b'&&ch!='\t')
{
putcstrbuf(ch);
}
else{
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
}
}
else if (ch=='.')
{
hcol=ccol;
putcstrbuf(ch);
state=2;
while (true)
{
ch=nextChar();
switch(state)
{
case 2:if(ch>='0'&&ch<='9')
{
putcstrbuf(ch);state=3;break;
}
else{
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x11d) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
state=8;
break;
}
case 3:if(ch>='0'&&ch<='9')
{
putcstrbuf(ch);state=3;break;
}
else if (ch=='F'||ch=='f')
{
tcol=ccol;
putcstrbuf(ch);
putcstrbuf('\0');
state=4;
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x108) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
else if (ch=='E'||ch=='e')
{
state=5;putcstrbuf(ch);break;
}
else {
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
state=9;
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x108) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
case 5:if (ch=='+'||ch=='-')
{
putcstrbuf(ch);
state=6;
break;
}
else if (ch>='0'&&ch<='9')
{
putcstrbuf(ch);
state=7;
break;
}
else {
state=10;
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
case 6:if(ch>='0'&&ch<='9')
{
putcstrbuf(ch);state=7;break;
}
else {
state=10;
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x100) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
case 7:if(ch>='0'&&ch<='9')
{
putcstrbuf(ch);state=7;break;
}
else if (ch=='F'||ch=='f')
{
tcol=ccol;
putcstrbuf(ch);
putcstrbuf('\0');
state=4;
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x108) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
else {
state=10;
tcol=ccol-1;
backBuf();
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x108) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
}
if (state==8||state==9||state==10||state==4)
{
break;
}
}
}
else if (ch=='0')
{
hcol=ccol;
putcstrbuf(ch);
state=0;
while (true)
{
ch=nextChar();
switch(state)
{
case 0:if (ch=='E'||ch=='e')
{
putcstrbuf(ch);
state=1;
break;
}
else if (ch=='.')
{
putcstrbuf(ch);
state=2;
break;
}
else if (ch>='0'&&ch<='7')
{
putcstrbuf(ch);
state=3;
break;
}
else if (ch=='X'||ch=='x')
{
putcstrbuf(ch);
state=11;
break;
}
else{
tcol=ccol-1;
backBuf();
state=7;
putcstrbuf('\0');
fprintf(outstream,"%5d-%3d: (%3d-%3d) (0x107) [%s]\n",line,++cnum,hcol,tcol,strbuf);
strbufi=0;
break;
}
case 1:if (ch=='+'||ch=='-')
{
putcstrbuf(ch);
state=6;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -