【发布时间】:2011-12-09 15:26:29
【问题描述】:
假设我想为一种编程语言(EBNF 已知)制作一个解析器,并希望尽可能少地大惊小怪。另外,我想支持任何 UTF-8 字母的标识符。我想要它在 C++ 中。
flex/bison 不存在 UTF-8 支持,正如我所读。 ANTLR 似乎没有可用的 C++ 输出。
我考虑过boost::spirit,他们在他们的网站上声明它实际上并不适用于完整的解析器。
还剩下什么?用手完全滚动?
【问题讨论】:
-
我认为
boost::spirit可以正常工作。见boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/… -
您可以使用 AX C++11 解析器生成器(带有 VC2010)。它支持宽字符,您需要编写规则将 UTF8 映射到 wchar_t,这并不难。 wchar_t 需要能够表示关联语言环境中的任何字符。不过没有正则表达式。
-
我现在正在尝试 boost::spirit,但这在 UTF8 上似乎也不太好
-
boost::spirit 存在一个巨大的问题,即对于超过十几个规则的 EBNF 的任何东西,编译时间都会过长。恕我直言,它不适用于现实世界的问题。 stackoverflow.com/questions/5504997/…
-
@phresnel 我无法想象一个现实世界的问题需要精神来解决。当然,家庭作业练习,但在现实世界中存在特殊情况和极端情况,每种情况都需要添加额外的规则来处理。我认为精神是邪恶的。它很优雅,似乎在测试用例中运行良好,因此您需要花费数天时间来学习错综复杂的东西——当您意识到它在现实世界中毫无用处时,这些时间就被浪费了。这就是它被称为精神的原因吗?