解析:库函数,FSM,explode()或lex/yacc?

Phi*_*lip 6 c parsing lex scanf explode

当我必须解析文本(例如配置文件或其他相当简单/描述性的语言)时,我会想到几种解决方案:

  • 使用库函数,例如strtok(),sscanf()
  • 一个有限状态机,一次处理一个字符,标记和解析
  • 使用explode()我曾经写过的纯粹无聊的功能
  • 使用lex/ yacc(读取:flex/ bison)生成适当的解析器

我不喜欢"库函数"的方法.感觉笨拙和尴尬.explode()虽然它不需要太多新代码,但感觉更加惊慌失措.并且flex/ bison经常看起来纯粹矫枉过正.

我通常会实现一个FSM,但与此同时,我已经为可能需要在稍后维护我的代码的可怜人员感到遗憾.

因此我的问题是:

解析相对简单的文本文件的最佳方法是什么?
它有关系吗?
是否有共同商定的方法?

JXG*_*JXG 6

我要打破规则,不按顺序回答你的问题.

  • 是否有共同商定的方法?

绝对不.恕我直言,你选择的解决方案应该取决于(仅举几例)你的文字,你的时间表,你的经验,甚至你的个性.如果文字很简单,可以制作flexbison矫枉过正,那么C本身就是矫枉过正.快速或强大是否更重要?它是否需要维护,还是可以快速而肮脏地开始?您是一位充满热情的C用户,还是能够被恰当的语言功能所吸引?&c.,&c.

  • 它有关系吗?

同样,这是你能回答的问题.如果您与具有特定技能和能力的人员密切合作,并且解析器很重要且需要维护,那确实很重要!如果你正在写"出于纯粹的无聊",我会建议它根本不重要,不.:-)

  • 解析相对简单的文本文件的最佳方法是什么?

好吧,我不知道你会喜欢我的回答.也许先在这里阅读其他一些好的答案.

不,真的,继续吧.我会等.

啊,你回来了,放松了.让我们放松一下,不是吗?

如果你能用'awk'做,就不要用'C'来写它;
如果'sed'可以处理它,就不要在'awk'中这样做;
当'tr'可以完成工作时,切勿使用'sed';
当'cat'足够时,永远不要调用'tr';
尽可能避免使用"猫".
- 泰勒的编程规律

如果你用C语言编写它,但C感觉就像错误的工具......它可能是错误的工具. awk或者perl很可能会在没有任何恶化的情况下做你想做的事情.你甚至可以用cut类似的东西来做.

另一方面,如果你用C语言编写它,你可能有充分的理由用C编写它.也许你的解析器只是一个更大系统的一小部分,为了论证,它是嵌入式的,在冰箱里,在月球上.或者,也许你loooove C.你甚至会恨awkperl,天forfend.

如果你不讨厌awk并且perl,你可能需要将它们嵌入到你的C程序.这是可行的,原则上 - 我自己从未这样做过.对awk,试试libmawk.因为perl,有可能有几种方法(TMTOWTDI).您可以perl单独运行popen来启动它,或者您可以实际将Perl解释器嵌入到您的C程序中 - 请参阅man perlembed.

无论如何,正如我所说,"解析的最佳方式"完全取决于您和您的团队,问题空间以及您解决问题的方法.我能提供的是我的意见.

我将假设在你的C-only解决方案(库函数和FSM(考虑到你explode本质上是一个库函数))中你已经尽力隔离相关代码,设计好代码和文件,以及等等.

即使这样,我也会推荐lexyacc.

图书馆功能感觉"笨拙和笨拙".状态机似乎无法维护.但是你说,lexyacc感觉有点小题大做.

我认为你应该以不同方式处理你的投诉.你真正在做的是指定一个FSM.但是,您也在雇用某人为您编写和维护它,从而解决了大部分可维护性问题.矫枉过正?我提到他们会免费工作吗?

我怀疑,但不知道,原因lexyacc最初感觉有点过分的原因是你的配置/简单文件只是觉得太简单了.如果我是对的(很大的话),你可以在词法分析器中完成大部分工作.(甚至可以想象你可以在词法分析器中完成所有工作,但我对你的输入一无所知.)如果你的输入不仅简单而且广泛,你可以找到一个免费提供的词法分析器/解析器组合你需要.

简而言之:如果你不能用C做到这一点,那就试试别的吧.如果你想要C,使用lex和 - yacc它们有一点开销,但它们是一个非常好的解决方案.