全局变量和过程:
ch 字符变量,存放最新读入的源程序字符
strToken 字符数组,存放构成单词符号的字符串
GetChar 子程序过程,把下一个字符读入到ch中
GetBC 子程序过程,跳过空白符,直至ch中读到非空白符
Concat 子程序,把ch中的字符连接到strToken
IsLetter和IsDigit 布尔函数,判断ch中字符是否为字母和数字
Reverse 整型函数,对于strToken中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0
Retract 子程序,把搜索指针回调一个字符位置
InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针
InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针
各种单词符号对应的种别编码
单词符号 | 种别编码 | 单词符号 | 种别编码 |
---|---|---|---|
program | 1 | ; | 17 |
const | 2 | , | 18 |
var | 3 | = | 19 |
procedure | 4 | <> | 20 |
begin | 5 | < | 21 |
end | 6 | <= | 22 |
if | 7 | > | 23 |
then | 8 | >= | 24 |
else | 9 | + | 25 |
while | 10 | - | 26 |
do | 11 | * | 27 |
call | 12 | / | 28 |
read | 13 | ( | 29 |
write | 14 | ) | 30 |
odd | 15 | id | 31 |
:= | 16 | integer | 32 |
代码节选
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;
}