好吧所以我正在编写一个函数作为词法分析器的一部分,它可以“查找”或搜索与关键字匹配的内容。我的词法分析器捕获所有明显的标记,例如单个和多个字符的运算符(+ - * / > < = == etc
)(还有注释和空格已经被取出)所以我在收集了只有字母数字字符的流(包括下划线)之后调用了一个函数)到string
,这个字符串需要匹配为已知关键字或标识符。
所以我想知道如何识别它?我知道我基本上需要将它与一些列表或数组或所有内置关键字中的某些内容进行比较,如果它匹配一个与其对应的枚举值匹配的返回值;否则,如果没有匹配,则它必须是函数或变量标识符。那我该怎么找比赛呢?我在某处读到了一个叫做二进制搜索树的东西是一种有效的方法,或者使用哈希表,问题是我从来没用过,所以我不确定它是否是正确的方法。我可以使用MySQL数据库吗?
答案 0 :(得分:4)
如果您的关键字集是固定的,则可以为O(1)查找构建perfect hash。查看gperf或cmph。
答案 1 :(得分:2)
"trie"肯定是最有效的方式。
答案 2 :(得分:2)
无论你有std::map的任何实施都可能就足够了。
答案 3 :(得分:2)
这是针对一种语言,一组特定的关键字永远不会改变,而且它们的数量不是很多?
如果是这样,你使用的东西可能并不重要。你会有更大的鱼来炒。
但是,由于列表没有改变,因此很难击败像这样的硬编码搜索:
// search on first letter
switch(s[0]){
case 'a':
// search on 2nd letter, etc.
break;
case 'b':
// search on 2nd letter, etc.
break;
........
case '_':
// search on 2nd letter, etc.
break;
}
答案 4 :(得分:0)
对于单个字符关键字,查找表将是完美的。对于多字符(特别是长度不同):哈希表。如果你需要性能,你甚至可以使用源代码生成来创建哈希表(使用一个简单的哈希函数,能否忽略大小写,具体取决于你的语法)。
所以我用LUT和哈希表实现它:首先用LUT检查第一个字符(如果它是一个简单的运算符,它将以非字母数字值开头),如果不是找到了,检查哈希表。