⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javascanner.cpp

📁 一个Java的词法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -