最近,我开始学习ANTLR。我知道词法分析器/解析器一起可以用来构建编程语言。
除了 DSL 或编程语言,您是否曾直接或间接使用词法分析器/解析器工具(和知识)来解决现实世界的问题?普通程序员是否有可能在没有词法分析器或解析器知识的情况下解决这些问题?
最近,我开始学习ANTLR。我知道词法分析器/解析器一起可以用来构建编程语言。
除了 DSL 或编程语言,您是否曾直接或间接使用词法分析器/解析器工具(和知识)来解决现实世界的问题?普通程序员是否有可能在没有词法分析器或解析器知识的情况下解决这些问题?
是的,我用过它们。是的,你可以在没有它们的情况下做事——但任何时候你为工作选择了错误的工具,你都会给自己带来不必要的痛苦。
我个人将技术应用于以下非标准用途的一些示例:
语法高亮。Scite文本编辑器允许您编写自己的词法分析器(在 C++ 中)为任何自定义语言提供语法突出显示。我为 Scite 编写了自己的自定义词法分析器,作为对该主题的复习(我不久前在大学学习过)。
正则表达式通常用作模式匹配和简单语言处理的替代方法。由于 .NET 等框架中改进的 RegEx 支持,近年来这种情况更加普遍。在许多情况下,开发人员甚至可能不知道词法分析/解析技术,因此默认使用使用正则表达式。
然而,正如另一个答案所说,正则表达式很快就会变得低效、缓慢且难以维护,而不仅仅是简单的语法/语言。在这种情况下,解析器/词法分析器通常是最佳选择。
是的,我在现实世界中使用过它们——但大多数情况下,您使用词法分析器和解析器创建的自定义语言已被 XML 中定义的语言所取代。更冗长,但你不必做所有这些工作......
您处理文本输入的任何地方最终都会使用某种词法分析器/解析器,尽管有时它们最终会成为退化的情况(除了逗号作为一种标记类型和逗号作为另一种之外的任何东西。解析一个数字、一个名称、一个数字和行尾。那种事情)从一种角度来看,它sscanf
可以被认为是词法分析器/解析器生成器的最退化的情况。
至于完整的 lex/yacc 操作?我希望它主要用于GPL和属于 DSL 松散定义的事物
只要存在静态文档(例如,文件)或动态文档(例如,随时间发生的流),并且该文档具有任何类型的结构,您就会发现自己需要某种解析器。对于足够简单的结构,您可以使用临时解析(字符串黑客、正则表达式等)。对于不嵌套的结构,您可以使用有限状态机;在这里,词法分析器生成器通常很有帮助。对于复杂的结构,你几乎是一个有组织的解析器。如果您熟悉递归下降样式解析,则可以手动编写解析器。对于非常复杂的结构,解析器生成器几乎总是一个巨大的胜利。
如果您想处理计算机语言,您几乎需要词法分析器和解析器作为起点。它们还不够;你必须对解析器结果做一些事情。
我们所做的词法分析和解析的一个非常壮观的用法是将 1960 年代的语言 JOVIAL 翻译成 C,用于 B-2 隐形轰炸机。请参阅http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html
在许多系统中使用的词法分析器/解析器的一个很好的例子存在于 Apache Lucene(一个开源搜索索引库)中。查询解析器和文档标记器都使用这些技术。虽然我猜您可以将 Lucene 中的查询解析器归类为 dsl 解析器,但它仍然被用于帮助解决现实世界的问题。
就此而言,我确信谷歌正在使用某种词法分析器/解析器来进行自己的查询语法和文档解析。
这很有趣 -
我只是手动编写了一个词法分析器/解析器,以允许由 IBindingListView 实现处理简单的基于字符串的查询表达式。这是我实际上能够使用它的代码之外的第一个有用的东西,而不仅仅是听说过它。
非常行人的例子,但在我与他们的经验中我非常行人。
我还没有使用其中一个大人物来进行任何词法分析,但是我已经为我从事的项目手动编写了自己的词法分析器。我们必须解析从近太空项目的数据计算机返回的数据,并将其以二进制形式写入 SD 卡。我不得不将这些位分开,将它们从二进制转换为十进制,然后将全部内容写在一个逗号分隔的文件中。
坐下来进行逻辑思考并为手头的任务编写状态机是一件很有趣的事情!
是的!我合作的团队已经实现了一个文档生成框架,其中允许(主要是算术)表达式被评估。我们使用解析器从生成的文档的输入/定义中提取表达式,并为它们创建表达式树。然后评估这些树并将评估结果写入最终文档。