【发布时间】:2013-01-04 04:50:19
【问题描述】:
我正在制作一个 LR(1) 解析器,但我在各个地方都遇到了性能瓶颈。
我想尝试优化解析器的数据结构,但为了做到这一点,我需要大致了解有多少状态、规则和终端符号对于(可能很复杂的)计算机语言是合理的,像 C++。
我的猜测是复杂语言的典型语法会:
- ≤100 个终端符号
- 每个产品≤ 50 个符号
- ≤ 2,000 条规则
- ≤10,000 个州
但我真的不知道它们有多正确。
请注意,我假设每个规则的形式为 nonterminal → symbol symbol symbol...,因此,看起来像 foo: (bar | baz)+ 的单个复合“规则”实际上可能包含 5 条规则,而不仅仅是 1 条规则。
它们合理吗?如果没有,我在哪里可以找到这些数字?
【问题讨论】:
-
我建议在您的问题中讨论其他语言,因为我认为 LR(1) 根本无法解析 C++。
-
@BenVoigt:我计划让它成为一个广义的 LR 解析器 (GLR),我认为它理论上可以处理 C++。如果我理解正确,C++ 的问题在于 LR(1) 语法是模棱两可的,而不是它不存在,对吧?所以应该没问题。
-
瓶颈在哪里?查找表/集的下一个状态应该只花费
O(1)。 -
@leppie:不幸的是(或幸运的是?)瓶颈在解析器的 generation 中(找出所有状态),而不是在实际的解析器中。
-
@Mehrdad:啊,这更有意义。但是生成解析器应该只是一个“一次性”的工作。就个人而言,我不会担心。 ;p