regex - 什么时候使用解析器生成器,什么时候使用正则表达式就足够了?

标签 regex parser-generator

我还没有进入计算机科学领域的形式语言领域,所以也许我的问题很愚蠢。我正在用C++写一个简单的NMEA解析器,我必须选择:

我的第一个想法是手动构建一个简单的有限状态机,但后来我想也许我可以用更少的工作,甚至更高效地做到这一点。我以前使用过正则表达式,但是我认为NMEA正则表达式很长,应该花很长时间才能匹配它。

然后我考虑使用解析器生成器。我认为所有人都使用相同的方法:它们生成FSA。但是我不知道哪个更有效。您通常何时使用解析器生成器而不是正则表达式(我认为您可以在解析器生成器中编写正则表达式)?

请解释差异,我对理论和经验都感兴趣。

最佳答案

好吧,一个简单的经验法则是:如果您要解析的数据的语法是regular,请使用正则表达式。如果不是这样,则正则表达式可能仍然有效(因为大多数正则表达式引擎也支持非正则语法),但可能很痛苦(复杂/性能较差)。

另一个方面是您尝试对解析的数据进行处理。如果您只对一个领域感兴趣,则正则表达式可能更易于阅读。如果需要读取深度嵌套的结构,则解析器可能更易于维护。

关于regex - 什么时候使用解析器生成器,什么时候使用正则表达式就足够了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1164621/

相关文章:

java - 如何将 JFlex 词法分析器与 JavaCC 解析器一起使用?

python - 在Python中使用正则表达式解析具有重复模式的字符串?

ruby - 正则表达式与?被动组内的量词?

Java Jacc、AST 和递归访问者

java - 如何在 JavaCC 语法中提及 try-catch block

c++ - AX 解析器生成器和 mingw gcc 4.6 运算符 &

asp.net - 为什么顺序在这个正则表达式中很重要并且交替?

python - 从主机字符串中删除最后一个句点

java - 正则表达式不匹配通配符

typescript - 我们如何获得TypeScript的语法树?