Parsing 您是否曾经在实际应用中有效地使用过lexer/parser?

Parsing 您是否曾经在实际应用中有效地使用过lexer/parser?,parsing,compiler-construction,tokenize,lexical-analysis,Parsing,Compiler Construction,Tokenize,Lexical Analysis,最近,我开始学习ANTLR。我知道lexer/parser可以一起用来构造编程语言 除了DSL或编程语言之外,您是否曾直接或间接使用lexer/parser工具(和知识)来解决实际问题?对于普通程序员来说,在不了解词法分析器或解析器的情况下解决这些问题是可能的吗?是的,我使用过它们。是的,你可以不用它们来做事情——但任何时候你为工作选择了错误的工具,你都会给自己带来不必要的痛苦 我个人将该技术用于非标准用途的一些示例: 从旧式系统生成的报告中删除数据 在对regexp来说过于复杂的数据中选择模

最近,我开始学习ANTLR。我知道lexer/parser可以一起用来构造编程语言


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

是的,我使用过它们。是的,你可以不用它们来做事情——但任何时候你为工作选择了错误的工具,你都会给自己带来不必要的痛苦

我个人将该技术用于非标准用途的一些示例:

  • 从旧式系统生成的报告中删除数据
  • 在对regexp来说过于复杂的数据中选择模式
  • 协议分析
  • 基于文本的冒险游戏
  • 吃了托莱多(不是真名)的元编程API
  • 代码分析/日志分析
  • 在数据库中分离“自由形式”字段
  • 我忘记的更多(我老了)

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

就这一点而言,我确信谷歌正在为自己的查询语法和文档解析使用某种lexer/解析器。

语法突出显示。文本编辑器允许您编写自己的lexer(用C++)来为任何自定义语言提供语法突出显示。我为Scite编写了自己的自定义lexer,作为此主题的复习(我不久前在我的大学里学的)

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


然而,正如另一个答案所说,正则表达式很快就会变得效率低下、速度慢,而且除了简单的语法/语言之外,任何东西都很难维护。在这种情况下,解析器/词法分析器通常是最佳选择。

是的,我在现实世界的东西中使用过它们,但主要是创建自定义语言,您使用词法分析器和语法分析器来实现这已经被XML中定义的语言所取代。更详细,但您不必做所有这些工作…

这很有趣-

我只是手工编写了一个lexer/parser,允许IBindingListView实现处理简单的基于字符串的查询表达式。这是我实际能够使用它的代码之外的第一件有用的事情,而不仅仅是听说过它


非常普通的例子,但我对它们的体验非常普通。

是的,我使用过它们。我是ANTLR的忠实粉丝。我给出了一些使用ANTLR的技巧和技巧,并对其进行了简要的认可。可以使用特殊方法手工编写自己的解析器,但这要困难得多,而且要花很长时间才能弄清楚如何使用ANTLR当你需要发展你的解析器应该解析的语言时,ke会发生变化。

我还没有使用一个大家伙来做任何词法分析,但是我已经为我所从事的一个项目手工编写了我自己的词法分析器。我们必须解析从一个近空间项目的数据计算机返回的数据,并将其以二进制形式写入SD卡我必须把这些位分开,把它们从二进制转换成十进制,然后把全部内容写在一个逗号分隔的文件中


坐下来,逻辑地思考,为手头的任务编写一个状态机,这是一件非常有趣的事情。

任何处理文本输入的地方最终都会使用某种lexer/parser,尽管有时它们最终会退化(lex任何东西,除了逗号作为一种标记类型,逗号作为另一种标记类型。解析数字、名称、数字和行尾。诸如此类)从一种角度来看,sscanf可以被认为是lexer/解析器生成器最退化的情况


至于全面的lex/yacc操作?我希望它主要用于DSL松散定义下的事物,无论何时存在静态文档(例如,文件)或动态文档(例如,随时间发生的流),并且该文档具有任何类型的结构,您将发现自己需要某种类型的解析器。对于足够简单的结构,您可以使用即席解析(字符串黑客、正则表达式等)。对于不嵌套的结构,您可以使用有限状态机;在这里,lexer生成器通常很有用。对于复杂结构,您基本上是一个有组织的解析器。如果您熟悉递归下降式解析,您可以手动编写解析器。对于真正复杂的结构,解析器生成器几乎总是一个大问题赢

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

我们所做的词法分析和句法分析的一个非常惊人的用途是翻译JOVIAL, 一种20世纪60年代的语言,转换成C,用于B-2隐形轰炸机。
请参见

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

同意-我再也不想手动编写表达式了。ANTLR有一些经验不过,你可以在如何将它整合到你的语言中。