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

📄 scanner.h

📁 C语言的语法分析器
💻 H
字号:
#ifndef SCANNER_H
#define SCANNER_H
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"iostream.h"
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
//syn为单词种别码,p是缓冲区prog的指针,m是token的指针,sum为数字
char *rwtab[6]={"begin","if","then","while","do","end"};
void error()
{
	cout<<"Error(s) appear(s)!\n";
}
void scanner()
{
	for(n=0;n<8;n++)
		token[n]=NULL;
	m=0;
	sum=0;
	ch=prog[p++];
	while(ch==' ')
		ch=prog[p++];
	if((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z'))
	{
		while((ch>='A'&&ch<='Z')||(ch>='a' && ch<='z')||(ch>='0' && ch<='9'))
		{
			token[m++]=ch;
			ch=prog[p++];
		}
		token[m++]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)
			if(strcmp(token,rwtab[n])==0)
			{	
				syn=n+1;
				break;
			}
		cout<<'('<<syn<<','<<token<<')';
	}
	else
		if(ch>='0'&&ch<='9')
		{
			while(ch>='0'&&ch<='9')
			{
				sum=sum*10+(int)(ch-'0');
				ch=prog[p++];
			}
			p--;
			syn=11;
			cout<<'('<<syn<<','<<sum<<')';
		}
	else
		switch(ch)
	{
		case '+':syn=13;cout<<'('<<syn<<','<<ch<<')';break;
		case '-':syn=14;cout<<'('<<syn<<','<<ch<<')';break;
		case '*':syn=15;cout<<'('<<syn<<','<<ch<<')';break;
		case '/':syn=16;cout<<'('<<syn<<','<<ch<<')';break;		
		case ':':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='=')
			{
				syn=18;
				cout<<'('<<syn<<','<<":="<<')';
			}
			else 
			{
				syn=17;
				cout<<'('<<syn<<','<<":"<<')';
				p--;
			}
			break;
		case '<':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='>')
			{
				syn=21;
				cout<<'('<<syn<<','<<"<>"<<')';
			}
			else if(ch=='=')
			{
				syn=22;
				cout<<'('<<syn<<','<<"<="<<')';
				
			}
			else
			{
				p--;
				syn=20;
				cout<<'('<<syn<<','<<"<"<<')';
			}
			break;
		case '>':m=0;token[m++]=ch;ch=prog[p++];
			if(ch=='=')
			{
				syn=24;
				cout<<'('<<syn<<','<<">="<<')';
				
			}
			else
			{
				p--;
				syn=23;
				cout<<'('<<syn<<','<<">"<<')';
			}
			break;
		case '=':syn=25;cout<<'('<<syn<<','<<ch<<')';break;
		case ';':syn=26;cout<<'('<<syn<<','<<ch<<')';break;
		case '(':syn=27;cout<<'('<<syn<<','<<ch<<')';break;
		case ')':syn=28;cout<<'('<<syn<<','<<ch<<')';break;
		case '#':syn=0;cout<<'('<<syn<<','<<ch<<')';break;		
		default: syn=-1;error();break;
	}
}

#endif SCANNER_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -