Pascal 词法分析器 简易实现

全局变量和过程:
ch 字符变量,存放最新读入的源程序字符

strToken 字符数组,存放构成单词符号的字符串

GetChar 子程序过程,把下一个字符读入到ch中

GetBC 子程序过程,跳过空白符,直至ch中读到非空白符

Concat 子程序,把ch中的字符连接到strToken

IsLetterIsDigit 布尔函数,判断ch中字符是否为字母和数字

Reverse 整型函数,对于strToken中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0

Retract 子程序,把搜索指针回调一个字符位置

InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针

InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针

各种单词符号对应的种别编码

单词符号种别编码单词符号种别编码
program1;17
const2,18
var3=19
procedure4<>20
begin5<21
end6<=22
if7>23
then8>=24
else9+25
while10-26
do11*27
call12/28
read1329
write1430
odd15id31
:=16integer32

代码节选

void Analysis(int &code)
{
	for (int i = 0; i < 20; i++)
		strToken[i] = '\0';
	GetChar();
	row++;
	GetBC();
	if (IsLetter())
	{
		while (IsLetter() || IsDigit())
		{
			Concat();
			GetChar();
			row++;
		}
		Retract();
		row--;
		code = Reverse();
	}
	else if (IsDigit())
	{
		while (IsDigit())
		{
			Concat();
			GetChar();
			row++;
		}
		Retract();
		row--;
		code = 32;
	}
	else if (ch == ':')
	{
		Concat();
		GetChar();
		row++;
		if (ch == '=')
		{
			Concat();
			code = 16;
		}
		else
		{
			Retract();
			row--;
			code = 0;
		}
	}
	else if (ch == ';')
	{
		Concat();
		code = 17;
	}
	else if (ch == ',')
	{
		Concat();
		code = 18;
	}
	else if (ch == '=')
	{
		Concat();
		code = 19;
	}
	else if (ch == '<>')
	{
		Concat();
		code = 20;
	}
	else if (ch == '<')
	{
		Concat();
		code = 21;
	}
	else if (ch == '<=')
	{
		Concat();
		code = 22;
	}
	else if (ch == '>')
	{
		Concat();
		code = 23;
	}
	else if (ch == '>=')
	{
		Concat();
		code = 24;
	}
	else if (ch == '+')
	{
		Concat();
		code = 25;
	}
	else if (ch == '-')
	{
		Concat();
		code = 26;
	}
	else if (ch == '*')
	{
		Concat();
		code = 27;
	}
	else if (ch == '/')
	{
		Concat();
		code = 28;
	}
	else if (ch == '(')
	{
		Concat();
		code = 29;
	}
	else if (ch == ')')
	{
		Concat();
		code = 30;
	}
	else if (ch == '\n' || ch == '\0')
	{
		line++;
		row = 0;
		code = -1;
	}
	else code = 0;
	sp = -1;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值