编译原理实验代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[实验任务]
完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。
<标识符>→字母︱<标识符>字母︱<标识符>数字
<无符号整数>→数字︱<无符号整数>数字
<单字符分界符> →+ ︱-︱* ︱; ︱(︱)
<双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>*
<小于>→<
<等于>→=
<大于>→>
<冒号> →:
<斜竖> →/
该语言的保留字:begin end if then else for do while and or not 说明:1 该语言大小写不敏感。
2 字母为a-z A-Z,数字为0-9。
3可以对上述文法进行扩充和改造。
4 ‘/*……*/’为程序的注释部分。
[设计要求]
1、给出各单词符号的类别编码。
2、词法分析程序应能发现输入串中的错误。
3、词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件。
4、设计两个测试用例(尽可能完备),并给出测试结果。
demo.cpp #include
#include
#include
#include "demo.h"
char token[20];
int lookup(char *token) {
for (int i = 0; i < 11; i++) {
if (strcmp(token, KEY_WORDS[i]) == 0) {
return i+1;
}
}
return 0;
}
char getletter(FILE *fp) {
return tolower(fgetc(fp));
}
void out(FILE *fp, int c, char *value) {
fprintf(fp, "%d,%s\n", c, value);
}
void report_error(FILE *fp, char ch) { fprintf(fp, "There must be some error.\n"); fprintf(fp, "%c...\n", ch);
fprintf(fp, "^\n");
}
void scanner(FILE *infile, FILE *outfile) { char ch;
int i, c;
do {
do {
ch = getletter(infile);
} while(isspace(ch));
if (isalpha(ch)) {
token[0] = ch;
ch = getletter(infile);
i = 1;
while (isalnum(ch)) {
token[i] = ch;
i++;
ch = getletter(infile);
}
token[i] = '\0';
fseek(infile, -1, 1);
c = lookup(token);
if (c == 0) {
out(outfile, ID, token);
}
else {
out(outfile, c, " ");
}
}
else {
if (isdigit(ch)) {
token[0] = ch;
ch = getletter(infile);
i = 1;
while (isdigit(ch)) {
token[i] = ch;
i++;
ch = getletter(infile);
token[i] = '\0';
fseek(infile, -1, 1);
out(outfile, INT, token); }
else {
switch(ch) {
case '<':
{
ch = getletter(infile);
if (ch == '=') {
out(outfile, LE, " ");
}
else if (ch == '>') {
out(outfile, NE, " ");
}
else {
fseek(infile, -1, 1);
out(outfile, LT, " ");
}
break;
}
case '=':
{
out(outfile, EQ, " ");
break;
}
case '>':
{
ch = getletter(infile);
if (ch == '=') {
out(outfile, GE, " ");
}
else {
fseek(infile, -1, 1);
out(outfile, GT, " ");
}
break;
}
case ':':
{
ch = getletter(infile);
if (ch == '=') {
out(outfile, FU, " ");