为pl/0语言建立一个词法分程序getsym(函数
时间: 2023-05-15 12:02:52 浏览: 162
语言建立一个词法分程序GETSYM(函数) _GETSYM()_pl/o程序_
5星 · 资源好评率100%
PL/0是一种简单的过程式语言,其中一个重要的部分就是词法分析器。getsym()函数是一个用于实现PL/0词法分析的函数。
getsym()函数从输入的源代码中读取一个字符或一个单词,并将其解释为一个符号。在PL/0中,符号可以是关键字(如var、begin、end等),标识符(变量名、函数名等)或运算符(如+、-、*、/等)。
下面是一个简单的getsym()函数实现:
```
int getsym() {
int i, j = 0;
char ch;
while (isspace(ch = getchar())); //跳过空格、制表符、换行符等
if (isdigit(ch)) { //处理数字
do {
j = j * 10 + ch - '0';
ch = getchar();
} while (isdigit(ch));
num = j;
return number;
} else if (isalpha(ch)) { //处理标识符或关键字
do {
str[j++] = ch;
ch = getchar();
} while (isalnum(ch));
str[j] = '\0';
if (strcmp(str, "begin") == 0) return beginsym;
else if (strcmp(str, "call") == 0) return callsym;
else if (strcmp(str, "const") == 0) return constsym;
else if (strcmp(str, "do") == 0) return dosym;
else if (strcmp(str, "end") == 0) return endsym;
else if (strcmp(str, "if") == 0) return ifsym;
else if (strcmp(str, "odd") == 0) return oddsym;
else if (strcmp(str, "procedure") == 0) return procsym;
else if (strcmp(str, "then") == 0) return thensym;
else if (strcmp(str, "var") == 0) return varsym;
else if (strcmp(str, "while") == 0) return whilesym;
else return identsym;
} else if (ch == ':') { //处理赋值符号
if ((ch = getchar()) == '=') {
ch = getchar();
return becomessym;
} else {
return nul; //错误:缺少等号
}
} else if (ch == '<') { //处理小于符号
if ((ch = getchar()) == '=') {
ch = getchar();
return leqsym;
} else {
return lsssym;
}
} else if (ch == '>') { //处理大于符号
if ((ch = getchar()) == '=') {
ch = getchar();
return geqsym;
} else {
return gtrsym;
}
} else if (ch == '+') { //处理加号
ch = getchar();
return plussym;
} else if (ch == '-') { //处理减号
ch = getchar();
return minussym;
} else if (ch == '*') { //处理乘号
ch = getchar();
return timesym;
} else if (ch == '/') { //处理除号
ch = getchar();
return slashsym;
} else if (ch == '(') { //处理左括号
ch = getchar();
return lparentsym;
} else if (ch == ')') { //处理右括号
ch = getchar();
return rparentsym;
} else if (ch == '=') { //处理等号
ch = getchar();
return eqsym;
} else if (ch == ',') { //处理逗号
ch = getchar();
return commasym;
} else if (ch == '.') { //处理句号
ch = getchar();
return periodsym;
} else {
return nul; //不合法字符
}
}
```
在实现getsym()函数时,需要预先定义一些符号类型的常量,例如:
```
#define nul 0 //空符号
#define ident 1 //标识符
#define number 2 //数字
#define plus 3 //+
#define minus 4 //-
#define times 5 //*
#define slash 6 // /
#define oddsym 7 //odd
#define eql 8 //=
#define neq 9 //#
#define lss 10 //<
#define leq 11 //<=
#define gtr 12 //>
#define geq 13 //>=
#define lparent 14 //(
#define rparent 15 //)
#define comma 16 //,
#define semic 17 //;
#define period 18 //.
#define becomes 19 //:=
#define beginsym 20 //begin
#define callsym 21 //call
#define constsym 22 //const
#define dosym 23 //do
#define endsym 24 //end
#define ifsym 25 //if
#define oddsym 26 //odd
#define procsym 27 //procedure
#define thensym 28 //then
#define varsym 29 //var
#define whilesym 30 //while
#define elsesym 31 //else
```
这样一来,getsym()函数就可以根据读取的字符或单词判断其类型,并将其转换为对应的符号类型并返回。在编译器中,getsym()函数会被调用多次,以识别整个输入程序中的所有符号,从而实现词法分析功能。
阅读全文