Phi*_*lip 6 c parsing lex scanf explode
当我必须解析文本(例如配置文件或其他相当简单/描述性的语言)时,我会想到几种解决方案:
strtok()
,sscanf()
explode()
我曾经写过的纯粹无聊的功能lex
/ yacc
(读取:flex
/ bison
)生成适当的解析器我不喜欢"库函数"的方法.感觉笨拙和尴尬.explode()
虽然它不需要太多新代码,但感觉更加惊慌失措.并且flex
/ bison
经常看起来纯粹矫枉过正.
我通常会实现一个FSM,但与此同时,我已经为可能需要在稍后维护我的代码的可怜人员感到遗憾.
因此我的问题是:
解析相对简单的文本文件的最佳方法是什么?
它有关系吗?
是否有共同商定的方法?
我要打破规则,不按顺序回答你的问题.
绝对不.恕我直言,你选择的解决方案应该取决于(仅举几例)你的文字,你的时间表,你的经验,甚至你的个性.如果文字很简单,可以制作flex
和bison
矫枉过正,那么C本身就是矫枉过正.快速或强大是否更重要?它是否需要维护,还是可以快速而肮脏地开始?您是一位充满热情的C用户,还是能够被恰当的语言功能所吸引?&c.,&c.
同样,这是你能回答的问题.如果您与具有特定技能和能力的人员密切合作,并且解析器很重要且需要维护,那确实很重要!如果你正在写"出于纯粹的无聊",我会建议它根本不重要,不.:-)
好吧,我不知道你会喜欢我的回答.也许先在这里阅读其他一些好的答案.
不,真的,继续吧.我会等.
啊,你回来了,放松了.让我们放松一下,不是吗?
如果你能用'awk'做,就不要用'C'来写它;
如果'sed'可以处理它,就不要在'awk'中这样做;
当'tr'可以完成工作时,切勿使用'sed';
当'cat'足够时,永远不要调用'tr';
尽可能避免使用"猫".
- 泰勒的编程规律
如果你用C语言编写它,但C感觉就像错误的工具......它可能是错误的工具. awk
或者perl
很可能会在没有任何恶化的情况下做你想做的事情.你甚至可以用cut
类似的东西来做.
另一方面,如果你用C语言编写它,你可能有充分的理由用C编写它.也许你的解析器只是一个更大系统的一小部分,为了论证,它是嵌入式的,在冰箱里,在月球上.或者,也许你loooove C.你甚至会恨awk
和perl
,天forfend.
如果你不讨厌awk
并且perl
,你可能需要将它们嵌入到你的C程序.这是可行的,原则上 - 我自己从未这样做过.对awk
,试试libmawk
.因为perl
,有可能有几种方法(TMTOWTDI).您可以perl
单独运行popen
来启动它,或者您可以实际将Perl解释器嵌入到您的C程序中 - 请参阅man perlembed
.
无论如何,正如我所说,"解析的最佳方式"完全取决于您和您的团队,问题空间以及您解决问题的方法.我能提供的是我的意见.
我将假设在你的C-only解决方案(库函数和FSM(考虑到你explode
本质上是一个库函数))中你已经尽力隔离相关代码,设计好代码和文件,以及等等.
即使这样,我也会推荐lex
和yacc
.
图书馆功能感觉"笨拙和笨拙".状态机似乎无法维护.但是你说,lex
和yacc
感觉有点小题大做.
我认为你应该以不同方式处理你的投诉.你真正在做的是指定一个FSM.但是,您也在雇用某人为您编写和维护它,从而解决了大部分可维护性问题.矫枉过正?我提到他们会免费工作吗?
我怀疑,但不知道,原因lex
和yacc
最初感觉有点过分的原因是你的配置/简单文件只是觉得太简单了.如果我是对的(很大的话),你可以在词法分析器中完成大部分工作.(甚至可以想象你可以在词法分析器中完成所有工作,但我对你的输入一无所知.)如果你的输入不仅简单而且广泛,你可以找到一个免费提供的词法分析器/解析器组合你需要.
简而言之:如果你不能用C做到这一点,那就试试别的吧.如果你想要C,使用lex
和 - yacc
它们有一点开销,但它们是一个非常好的解决方案.
归档时间: |
|
查看次数: |
841 次 |
最近记录: |