c - 将短字符串与小字典进行比较的最有效方法(解析)

标签 c algorithm parsing lexical-analysis

我正在尝试优化我只是为了好玩而制作的简单 C 解释器,我正在像这样进行解析 - 首先我将文件解析为双向链表内的标记,然后进行语法和语义分析。
我想用这个原型(prototype)优化功能:

bool parsed_keyword(struct token *, char 字典[][]);

在函数内部,我基本上针对所有关键字调用 strcmp 并编辑 token 类型。 这当然会导致(几乎)每个正在解析的字符串需要 20 次 strcmp 调用。

我认为 Rabin-Karp 是最好的,但在我看来,它并不是最适合这项工作(将一个单词与小词典进行匹配)。 完成这项工作的最佳算法是什么?感谢您的任何建议。

最佳答案

对于这个特定问题,我可能会选择哈希表。它将提供 O(1) 查找您大小的表。不过,特里树也是一个不错的选择。

但是,最简单的实现方法是将单词按字母顺序放入数组中,然后使用 C 库中的 bsearch。它应该几乎与哈希或特里树一样快,因为您只处理 30 个单词。它实际上可能比哈希表更快,因为您不必计算哈希值。

Steve Jessop 的想法很好,将字符串首尾相连地布局在相同大小的字符数组中。

const char keywords[][MAX_KEYWORD_LEN+1] = {
 "auto", "break", "case", /* ... */, "while"
};

#define NUM_KEYWORDS sizeof(keywords)/sizeof(keywords[0])

int keyword_cmp (const void *a, const void *b) {
    return strcmp(a, b);
}

const char *kw = bsearch(word, keywords, NUM_KEYWORDS, sizeof(keywords[0]),
                         keyword_cmp);

int kw_index = (kw ? (const char (*)[MAX_KEYWORD_LEN+1])kw - keywords : -1);

如果您还没有,您应该考虑获取 Compilers: Principles, Techniques, and Tools 的副本。由于其封面,它通常被称为龙之书

关于c - 将短字符串与小字典进行比较的最有效方法(解析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11399880/

相关文章:

c - 标准输入重定向行为与 libuv 不一致

c - 在单字节数组中对齐混合字符串和整数数据的方法有哪些?

python - 拓扑排序python

c++ - 合并 k 个排序列表超出时间限制(leetcode)

python - 使用 Python 从网页中提取半结构化的用户生成内容

c - 对用户输入设置时间限制

algorithm - 如何找出对 nCr 函数的调用次数

android - 在android中递归读取json对象递归?

javascript - ANTLR4 JavaScript 解析器 : how to catch an error in parsing

C: 为什么在我的程序中输出数字不在标准 RGB 范围内:0-255?