山东大学 编译原理实验 getsym
时间: 2023-12-05 22:02:23 浏览: 50
编译原理实验中的getsym是指获取源程序中的一个单词或符号,并进行词法分析。在山东大学的编译原理实验中,getsym函数是完成此功能的具体代码实现。
在编译原理实验中,getsym函数的主要功能是从源程序中读取下一个词法单元,并将其存储为一个符号结构。该函数通常包括一系列的识别规则和状态转换机制,用于识别代码中的各种关键字、运算符、分隔符和标识符等。
当调用getsym函数时,它会从源程序中读取一个字符,并根据事先定义的识别规则将其与相应的符号进行匹配。如果匹配成功,则将该符号存储到符号结构中,并返回给调用者;否则,继续读取下一个字符,直到找到一个合法的符号。
getsym函数常用于编译器的词法分析阶段,将源程序按照词法的规则进行划分,并建立相应的符号表。在山东大学的编译原理实验中,getsym函数是完成此任务的重要组成部分。通过该函数的调用,可以逐个获取源程序中的符号,并将其用于后续的语法分析和语义分析等阶段,从而完成编译过程的各项工作。
相关问题
getsym 国防科大编译原理
getsym 是一个在编译原理中常用的函数,用于从输入的字符流中获取下一个符号(token)。在国防科大编译原理课程中,getsym 函数通常在词法分析器(lexer)中使用,用于将源代码中的字符序列转换为一系列的符号,以供后续的语法分析器(parser)使用。
具体来说,getsym 函数会读取输入字符流中的下一个字符,并根据该字符的类型和当前的状态转移表(DFA)来确定下一个符号的类型。如果当前字符不能组成一个完整的符号,则 getsym 函数会继续读取输入字符流中的下一个字符,直到找到一个完整的符号为止。
在实现 getsym 函数时,需要考虑多种情况,如空格、换行符、数字、字母、运算符等等。具体实现方法可以参考国防科大编译原理课程中的教材或相关资料。
PL0程序GetSym的实现过程
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;
}
}
```