我创建了一个包含一些规则的解析器和扫描程序,如;
用于flex文件:
{tINT} return tINT ;
{tFLOAT} return tFLOAT ;
对于野牛档案:
program : declarations statements
;
declarations: assignment declarations
| epsilon
;
assignment: tIDENT tASSIGN literal
;
literal: tINT
|tFLOAT
|tSTRING
|tTRUE
|tFALSE
|list
现在我必须检查一些错误,例如; 未声明的变量,列表中的类型不匹配,变量的多个声明,变量的错误重新分配,类似类型中的类型不匹配,if,elif语句中的类型不匹配,for语句中的类型不匹配
我正在寻找的答案当然不适用于所有人。我只是想知道如何开始。提前谢谢。
答案 0 :(得分:1)
基本上你所询问的一切都与类型检查有关。
实现的典型方法涉及构建符号表,以便在(例如)获得声明i
为int
的声明时,存储该符号表。然后,当您获得i = j
之类的作业时,您可以检查j
是int
(或者,根据您的语言的转换规则,可以隐式转换为{的其他类型{1}},如果您允许隐式转换。)
就目前而言,你的语法似乎没有像类型声明那样的东西 - 它只有作业。为此,您可能希望根据分配给它们的值来决定类型。例如:
int
然后你可以到达:
i = 1 // i is an int
j = "something" // j is a string
基本上,对于您在作业中遇到的每个新标识符,您可以存储一些有关其类型的数据(基于作业右侧的任何类型)。然后,当您看到该变量的另一个赋值时,检查与右侧值相关联的类型,并检查它是否与左侧的现有类型兼容。
由于这显然是您第一次这样做,我会补充说"兼容"的最简单定义。通常是相同的" - 即,最简单地禁止所有转换。