编译原理实验手记

知识点

如何理解 bison -d-d 选项?

可以在英文版 flex and bison 中的 P13 找到如下解释:

First it runs bison with the -d (for “definitions” file) flag, which creates fb1-5.tab.c and fb1-5.tab.h, and it runs flex to create lex.yy.c.

%option 怎么用?

flex and bison 中解释:

If you set %option yylineno, flex defines yylineno to contain the current line number and automatically updates it each time it reads a character.

C 语言 atoi() 的作用?

将字符串转换为 int。

如何理解 yytext

flex and bison:

In any flex action, the variable yytext is set to point to the input text that the pattern just matched.

如何理解 C 语言 strcpy() 函数?

头文件:#include <string.h>

定义函数:char *strcpy(char *dest, const char *src);

函数说明:strcpy() 会将参数 src 字符串拷贝至参数 dest 所指的地址。

返回值:返回参数 dest 的字符串起始地址。

如何理解 yywrap()

When a lex scanner reached the end of yyin, it called yywrap(). The idea was that if there was another input file, yywrap could adjust yyin and return 0 to resume scanning. If that was really the end of the input, it returned 1 to the scanner to say that it was done.

如何解决 parser.y:1.1-14: warning: deprecated directive: ‘%error-verbose’, use ‘%define parse.error verbose’ [-Wdeprecated]

使用 %define "parse.error" "verbose" 代替原来的 %define parse.error verbose

具体参考:StackOverflow

Bugs 记录

问题一

问题描述:

error: invalid initializer

解决办法,

va_list pArgs = NULL;

改成

va_list pArgs;

这个属于库函数的用法,需要查阅相关文档。

问题二

这个问题属于重复定义问题。

解决方法:

在相应头文件中将所有重复定义的变量声明成外部变量。

如:

int LEV;

改成

extern int LEV;

再如:

struct symboltable{
    struct symbol symbols[MAXLENGTH];
    int index;
} symbolTable;

改成

struct symboltable{
    struct symbol symbols[MAXLENGTH];
    int index;
};

extern struct symboltable symbolTable;

将这两个问题解决后,发现可以正常编译,且编译出来的可执行文件可以正常运行:


编译原理实验手记
http://fanyfull.github.io/2021/11/09/编译原理实验手记/
作者
Fany Full
发布于
2021年11月9日
许可协议