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

6 regex parser-generator

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

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

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

请解释这些差异,我对理论和经验感兴趣.

sle*_*ske 7

嗯,一个简单的经验法则是:如果您尝试解析的数据的语法是常规的,请使用正则表达式.如果不是,正则表达式可能仍然有效(因为大多数正则表达式引擎也支持非常规语法),但它可能很痛苦(复杂/糟糕的性能).

另一个方面是您尝试使用已分析的数据.如果您只对一个字段感兴趣,那么正则表达式可能更容易阅读.如果您需要深入嵌套结构,则解析器可能更易于维护.