Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析:库函数、FSM、explode()或lex/yacc?_C_Parsing_Lex_Explode_Scanf - Fatal编程技术网

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

解析:库函数、FSM、explode()或lex/yacc?,c,parsing,lex,explode,scanf,C,Parsing,Lex,Explode,Scanf,当我必须解析文本(例如配置文件或其他相当简单/描述性的语言)时,我想到了几种解决方案: 使用库函数,例如strtok(),sscanf() 一种有限状态机,一次处理一个字符,进行标记化和解析 使用explode()函数,我曾经纯粹出于无聊而编写 使用lex/yacc(阅读:flex/bison)生成适当的解析器 我不喜欢“库函数”方法。这感觉既笨拙又尴尬explode(),虽然不需要太多的新代码,但感觉更糟。而且,flex/野牛通常看起来完全是杀伤力过大 我通常实现一个FSM,但同时我已经为

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

  • 使用库函数,例如
    strtok()
    sscanf()
  • 一种有限状态机,一次处理一个字符,进行标记化和解析
  • 使用
    explode()
    函数,我曾经纯粹出于无聊而编写
  • 使用
    lex
    /
    yacc
    (阅读:
    flex
    /
    bison
    )生成适当的解析器
我不喜欢“库函数”方法。这感觉既笨拙又尴尬
explode()
,虽然不需要太多的新代码,但感觉更糟。而且,
flex
/
野牛
通常看起来完全是杀伤力过大

我通常实现一个FSM,但同时我已经为这个可怜的家伙感到抱歉,他可能不得不在以后维护我的代码

因此,我的问题是:

解析相对简单的文本文件的最佳方法是什么?
这有什么关系吗?

是否有一种普遍认可的方法?

如果你能让它发挥作用,我会选择FSM,但我会得到FSM的大力协助。这个库很容易理解,你应该能够修剪掉足够多的多余的意大利面,让你的怪物拥有所有飞行怪物所渴望的空气动力学天赋。这一点,再加上大量结构良好的意大利面注释,应该会让您的代码维护更舒适。(而且,我相信你知道,六个月后,当你转向其他事情,并且忘记了此代码的细节时,代码维护的继任者就是你。)

我将稍微打破规则,无序地回答你的问题

  • 是否有共同商定的方法
绝对不是。我认为你选择的解决方案应该取决于(举几个例子)你的文本,你的时间框架,你的经验,甚至你的个性。如果文本足够简单,使得
flex
bison
过了头,那么C本身可能就过了头。快速还是稳健更重要?它是否需要维护,或者是否可以快速启动?你是一个充满激情的C用户,还是能被正确的语言特性所吸引&c、 和c

  • 这有关系吗
同样,这是只有你才能回答的问题。如果您正在与一群具有特殊技能和能力的人密切合作,并且解析器很重要,需要维护,那么它肯定很重要!如果你写的东西“纯粹是出于无聊”,我建议这根本没关系,不

  • 解析相对简单的文本文件的最佳方法是什么
我不知道你会喜欢我的答案。也许先在这里读一些其他的好答案

不,真的,说吧。我会等的

啊,你回来了,放松了。让我们慢慢来,好吗

如果你能用“awk”写,千万不要用“C”写
如果“sed”能处理,千万不要在“awk”中这样做
当“tr”可以完成工作时,切勿使用“sed”
当“cat”足够时,切勿调用“tr”
尽可能避免使用“cat”。
--泰勒规划定律

如果你是用C写的,但是C感觉是个错误的工具…它可能真的是个错误的工具
awk
perl
很可能会做您想做的事情,而不会让您感到恼火。您甚至可以使用
cut
或类似的工具来完成此操作

另一方面,如果你是用C写的,你可能有一个很好的理由用C写。也许你的解析器是一个更大的系统的一小部分,为了论证,它被嵌入在月球上的冰箱里。或者你喜欢C。你甚至可能讨厌
awk
perl
,天堂保佑

如果您不讨厌
awk
perl
,您可能希望将它们嵌入到您的C程序中。原则上,这是可行的——我自己从来没有做过。对于
awk
,请尝试
libmawk
。对于
perl
,可能有几种方法(TMTOWTDI)。您可以使用
popen
单独运行
perl
来启动它,也可以在C程序中嵌入一个perl解释器——请参见
man perlembed

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

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

即便如此,我还是要推荐
lex
yacc

库函数感觉“笨拙和笨拙”。状态机似乎无法维护。但是你说lex和yacc感觉太过分了

我认为你应该以不同的方式处理你的抱怨。您真正要做的是指定FSM。然而,您也雇佣了一些人为您编写和维护它,从而解决了大多数可维护性问题。过度杀戮?我说过他们会免费工作吗

我怀疑,但不知道,
lex
yacc
最初让人感觉有些过火的原因是,您的配置/简单文件感觉太简单了。如果我是对的(一个很大的如果),你也许可以在lexer中完成大部分工作。(甚至可以想象,你可以在lexer中完成所有的工作,但我对你的输入一无所知。)如果你的输入不仅简单而且广泛,你可能会找到一个lexer/parser的组合,免费提供给你所需要的

简言之:如果你不能用C语言来做这件事,那就试试别的。如果您想要C,请使用
lex<