你有没有在现实世界的应用程序中有效地使用词法分析器/解析器?

时间:2009-03-14 05:46:09

标签: parsing compiler-construction tokenize lexical-analysis

最近,我开始学习ANTLR。我知道lexers / parsers可以用来构建编程语言。

除了DSL或编程语言之外,您是否曾直接或间接使用词法分析器/解析器工具(和知识)来解决实际问题?普通程序员是否有可能在不了解词法分析器或解析器的情况下解决这些问题?

10 个答案:

答案 0 :(得分:14)

是的,我已经用过了。是的,你可以不做任何事情 - 但是每当你为工作选择错误的工具时,你都会为自己做出不必要的痛苦。

我亲自将该技术用于非标准用途的一些例子:

  • 从遗留系统生成的报告中抓取数据
  • 选择对于正则表达式而言过于复杂的数据模式
  • 协议分析
  • 基于文字的冒险游戏
  • 吃托莱多的元编程API(不是它的真名)
  • 代码分析/日志分析
  • 挑选数据库中的“自由形式”字段
  • 并且更多我忘记了(我已经老了)

答案 1 :(得分:5)

语法高亮显示。 Scite文本编辑器允许您编写自己的词法分析器(使用C ++),以便为任何自定义语言提供语法突出显示。我为Scite编写了自己的自定义词法分析器,作为对这个主题的复习(我刚刚在我的大学学习过它)。

正则表达式通常用作模式匹配和简单语言处理的替代方法。由于在.NET等框架中改进了RegEx支持,这在近几年更为常见。在许多情况下,开发人员可能甚至不知道lexing / parsing技术,因此默认情况下属于使用正则表达式。

然而,正如另一个答案所说,正则表达式可以很快变得低效,缓慢且难以维护,而不仅仅是简单的语法/语言。在那种情况下,解析器/词法分析器通常是最佳选择。

答案 2 :(得分:2)

是的,我在现实世界中使用过它们 - 但主要是使用词法分析器和解析器创建的自定义语言,已被XML中定义的语言所取代。更冗长但是你不必完成所有工作......

答案 3 :(得分:2)

是的,我已经用过了。我是ANTLR的忠实粉丝。我提供了一些关于使用ANTLR here的提示和技巧以及对它的简短认可here。可以使用ad hoc方法手工编写自己的解析器,但是当你需要增加解析器应该解析的语言时,它会花费更长的时间来弄清楚如何进行更改。

答案 4 :(得分:2)

你处理文本输入的任何地方最终都会使用某种类型的词法分析器/解析器,尽管有时它们最终会成为退化的情况(lex除了逗号之外的任何东西都是一个令牌类型而逗号是另一个。解析一个数字,一个名字在某种程度上看它sscanf可以被认为是词法分析器/解析器生成器最堕落的情况。

至于完整的lex / yacc操作?我希望它主要用于GPLs和那些属于DSL松散定义的东西

答案 5 :(得分:2)

只要存在静态文档(例如文件)或动态文档(例如,随时间发生的流),并且该文档具有任何类型的结构,您将发现自己需要某种解析器。对于足够简单的结构,您可以使用临时解析(字符串黑客,正则表达式等)。对于没有嵌套的结构,你可以使用有限状态机;这里的词法分析器通常很有帮助。对于复杂的结构,你几乎是一个有组织的解析器。如果您熟悉递归下降样式解析,则可以手动编写解析器。对于非常复杂的结构,解析器生成器几乎总是一个巨大的胜利。

如果你想处理一个计算机语言,你几乎需要词法分析器和解析器作为起点。他们还不够;你必须对解析器结果做一些事情。

我们所做的lexing和解析的一个非常壮观的用法是翻译JOVIAL, 一架20世纪60年代的语言,进入C语言,用于B-2隐形轰炸机。 见http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

答案 6 :(得分:1)

Apache Lucene(一个开源搜索索引库)中存在许多系统中使用的词法分析器/解析器的一个很好的例子。查询解析器和文档标记器都使用这些技术。虽然我猜你可以将Lucene中的查询解析器归类为dsl解析器,但它仍然被用来帮助解决现实问题。

就此而言,我确信谷歌正在使用某种词法分析器/解析器来处理它自己的查询语法和文档解析。

答案 7 :(得分:1)

这很有趣 -

我只是手动编写了一个词法分析器/解析器,以允许IBindingListView实现处理简单的基于字符串的查询表达式。这是代码之外的第一个有用的东西,我实际上已经能够使用它,而不仅仅是听说过它。

漂亮的行人示例,但我对他们的体验非常重要。

答案 8 :(得分:1)

我还没有使用其中一个大家伙进行任何词汇分析,但是我已经手工编写了我自己的词法分析器来处理我正在进行的项目。我们必须解析从Near Space项目的数据计算机返回的数据,并将其写入二进制的SD卡。我不得不将这些位分开,将它们从二进制转换为十进制,然后将整个内容写入逗号分隔文件中。

坐下来逻辑思考并为手头的任务编写状态机是很有趣的!

答案 9 :(得分:0)

是的!我合作的团队已经实现了一个文档生成框架,其中包括允许(主要是算术)表达式进行评估。我们使用解析器从生成的文档的输入/定义中提取表达式,并为它们创建表达式树。然后对这些树进行评估,并将评估结果写入最终文档。