编译原理实验代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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, " ");

相关文档
最新文档