如何创建yacc文件以识别输入中的错误

时间:2015-03-19 19:45:13

标签: parsing bison yacc flex-lexer

我创建了一个包含一些规则的解析器和扫描程序,如;

用于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语句中的类型不匹配

我正在寻找的答案当然不适用于所有人。我只是想知道如何开始。提前谢谢。

1 个答案:

答案 0 :(得分:1)

基本上你所询问的一切都与类型检查有关。

实现的典型方法涉及构建符号表,以便在(例如)获得声明iint的声明时,存储该符号表。然后,当您获得i = j之类的作业时,您可以检查jint(或者,根据您的语言的转换规则,可以隐式转换为{的其他类型{1}},如果您允许隐式转换。)

就目前而言,你的语法似乎没有像类型声明那样的东西 - 它只有作业。为此,您可能希望根据分配给它们的值来决定类型。例如:

int

然后你可以到达:

i = 1              // i is an int
j = "something"    // j is a string

基本上,对于您在作业中遇到的每个新标识符,您可以存储一些有关其类型的数据(基于作业右侧的任何类型)。然后,当您看到该变量的另一个赋值时,检查与右侧值相关联的类型,并检查它是否与左侧的现有类型兼容。

由于这显然是您第一次这样做,我会补充说"兼容"的最简单定义。通常是相同的" - 即,最简单地禁止所有转换。