假设我想为编程语言(EBNF已知)创建解析器,并希望尽可能少地完成它。另外,我想支持任何UTF-8字母的标识符。我想用C ++。
正如我所读到的那样, flex
/ bison
不存在UTF-8支持。 ANTLR似乎没有可用的C ++输出。
我考虑过boost::spirit,他们在自己的网站上声明它实际上不适合完整的解析器。
还剩下什么?完全按手动滚动?
答案 0 :(得分:6)
如果您没有找到具有所需支持的内容,请不要忘记Flex在编码方面几乎是独立的。它是一个八位字节流,我用它来说明纯二进制数据。以UTF-8编码的东西是一个八位字节流,可以通过flex处理,你接受手动做一些工作。 I.E.而不是
idletter [a-zA-Z]
如果你想接受作为字母拉丁文1补充范围内的所有内容除了NBSP(换句话说,在U00A1-U00FF范围内)你必须做的事情(我可能搞砸了编码,但你得到了主意)
idletter [a-zA-Z]|\xC2[\xA1-\xFF]|\xC3[\x80-\xBF]
您甚至可以编写一个预处理器来完成大部分工作(即用\ xC2 \ xA1替换\ u00A1并用\ xC2 [\ xA1- \ xFF] | \ xC3替换[\ u00A1- \ u00FF] [ \ x80- \ xBF],预处理器的工作量取决于您希望输入的通用程度,有时候您可能更好地将工作集成到flex中并将其贡献到上游)
答案 1 :(得分:3)
Parser使用令牌,知道编码不是它的责任。它通常只是比较令牌的ID,如果您编写特殊规则,您可以按照您在其他任何地方的方式比较下划线的UTF-8字符串。
所以你需要一个UTF-8词法分析器?嗯,这在很大程度上取决于你如何定义你的问题。如果您将标识符定义为包含ASCII字母数字和其他任何非ASCII字符串,那么flex将很好地满足您的需求。如果你想将Unicode范围实际输入词法分析器,你需要更复杂的东西。你可以看看Quex。我自己从未使用它,但它声称支持Unicode。 (虽然我会因为“根据角色指数自由告知/寻找”而杀死某人)
编辑: Here is a similar question,它声称flex不起作用,因为忽略某些实现可能有签名字符的错误......但它可能已经过时了。