【问题标题】:Which is the key and which is the item for a keywords hash table?哪个是关键字,哪个是关键字哈希表的项?
【发布时间】:2014-11-15 08:01:23
【问题描述】:
我需要实现一个词法分析器,我需要一个数据结构来保存关键字。
有人建议我使用哈希表来保留关键字,一个建议是使用 C# 哈希表表单 System.Collections。但是我有一个问题:要使用这个哈希表,我需要一个键和一个项目。我只有关键字。我应该使用关键字作为键还是作为项目,或者两者兼而有之?
由于关键字不同,我可以使用其他数据结构,例如二叉树吗?
我真正感兴趣的是:编译器如何实现这个问题?
【问题讨论】:
标签:
c#
data-structures
compiler-construction
compilation
lexical-analysis
【解决方案1】:
一般来说,关键字只有句法值,所以在大多数编译器中,它们只用于选择适当的语法规则。因此,它们的“价值”会立即被消耗。由于他们的身份是唯一有用的信息,因此使用HashSet 可能比HashMap 更合适。
但是,可能有一组在语法上相同的关键字,形成了一种有效的枚举类型。在这种情况下,枚举值可以是与关键字关联的值。
对于手工构建的词法分析器,使用哈希集或其他此类数据结构可能很简单,但大多数编译器实际上会将关键字与其他词法标记模式一起编译成有限状态自动机。这允许在词法扫描期间识别关键字,而无需任何外部数据结构。
无论如何,在几乎所有语言中,关键字集都是固定的,因此使用编译到词法扫描器中的高效数据结构是最合适的。例如,代替二叉树,使用可以进行二分搜索的排序静态字符串向量是合理的。或者,可以使用预先构建的 trie;这几乎等同于上面提到的有限状态自动机。