背景:我正在制作编译器,扫描仪和解析器已经完成。我们有正式的语法,它将程序定义为:
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中?
谢谢!
答案 0 :(得分:0)
我认为您正在寻找的是范围,您需要使用范围来保存与堆栈类似的结构中与之关联的所有变量,例如一个函数有自己的作用域,当剩下这个函数时,它会从栈中弹出。