在编译期间存储变量和常量。 (样本语言)

时间:2010-10-25 08:43:23

标签: compiler-construction storage identifier

背景:我正在制作编译器,扫描仪和解析器已经完成。我们有正式的语法,它将程序定义为:

program = 
 declarations 
 procedureDeclarations
 main  (  ){  
     declarations 
     statementSequence
 }

因此您可以注意到声明可以是main方法的全局声明或本地声明。因此,当我解析时,我需要一种存储这三件事的方法:进入的标识符是:常量还是变量(我可以通过哪种解析方法告诉我,parseConst()或parseVar()),全局或本地,它的实际名称,它的价值(如果我知道的话)。

我有点困惑如何存储所有这些。在我的数据结构类中,我们实际上只需要存储两件事,一个键和一个值。我会有类似的东西:

 identHashMap<String, String> // where the first string is the ident's name, and the second is if it's a constant or var (this could be a boolean also)
 constantIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string)
 varIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string)
 identifierValues<String, Integer> // ident's name, Ident's value
对于简单的任务来说,似乎有太多的数据结构。我应该创建一个类,标识符,还有一个全局/局部布尔字段,以及一个常量/ var布尔值?然后将它们全部放在一个标识符hashmap中?

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是范围,您需要使用范围来保存与堆栈类似的结构中与之关联的所有变量,例如一个函数有自己的作用域,当剩下这个函数时,它会从栈中弹出。