PL0程序GetSym的实现过程
时间: 2024-01-24 12:16:42 浏览: 23
PL0语言的GetSym函数是用来从源代码中读取一个单词符号的。它的实现过程如下:
1. 定义一个指针变量p,指向当前要读取的字符。
2. 跳过空格和注释,将p指向第一个非空字符。
3. 判断p所指向的字符是不是数字或字母,如果是,说明是一个标识符或保留字,那么从p开始向后读取字符,直到读到一个非数字或字母的字符为止。将读取到的字符串与保留字表中的单词进行比较,如果匹配成功,则返回对应的保留字,否则返回标识符。
4. 如果p所指向的字符不是数字或字母,那么判断它是不是运算符或界符。如果是,则返回对应的符号。
5. 如果p所指向的字符既不是数字或字母,也不是运算符或界符,则说明出现了错误,报告错误并返回一个特殊的错误符号。
下面是一个简单的C++实现示例:
```cpp
// 保留字表
const string keywords[] = {"begin", "call", "const", "do", "end", "if", "odd", "procedure", "read", "then", "var", "while", "write"};
// 运算符和界符表
const char symbols[] = {'+', '-', '*', '/', '(', ')', '=', ',', '.', '<', '>', ';', ':'};
// GetSym函数的实现
void GetSym() {
// 跳过空格和注释
while (*p == ' ' || *p == '\t' || *p == '\n' || (*p == '/' && *(p + 1) == '/')) {
if (*p == '/' && *(p + 1) == '/') { // 注释
while (*p != '\n') p++;
}
p++;
}
// 判断是保留字还是标识符
if (isalpha(*p)) { // 标识符或保留字
char ident[20];
int i = 0;
do {
ident[i++] = *p++;
} while (isalnum(*p));
ident[i] = '\0';
for (i = 0; i < 13; i++) {
if (keywords[i] == ident) {
sym = i + 1;
return;
}
}
sym = IDENT;
strcpy(id, ident);
} else if (isdigit(*p)) { // 数字
int num = 0;
do {
num = num * 10 + (*p - '0');
p++;
} while (isdigit(*p));
sym = NUMBER;
number = num;
} else { // 运算符或界符
sym = *p++;
for (int i = 0; i < 13; i++) {
if (symbols[i] == sym) {
return;
}
}
error("Invalid symbol");
sym = UNKNOWN;
}
}
```