gpt4 book ai didi

regex - 正则表达式是否用于构建解析器?

转载 作者:行者123 更新时间:2023-12-02 03:59:50 24 4
gpt4 key购买 nike

这只是出于好奇的一个问题,因为我最近需要越来越多地进行解析和使用正则表达式..似乎,对于我在搜索中遇到的有关某种解析的问题,总是有人会结束说,当被问到与正则表达式相关的问题时,“正则表达式对此不好,请使用这样那样的解析器”......随着我更好地理解正则表达式,我认为大多数东西都是可能的,只是它相当复杂和时间消耗,因为你必须考虑许多不同的可能性,当然,它必须与条件语句和循环结合起来构建任何类型的解析器..所以我想知道正则表达式是否用于构建大多数解析器或者是正在使用其他一些方法..我只是想知道,因为我可能需要构建一些相当复杂的自定义解析器,而不一定需要使用现有的解析器。

感谢您提供任何信息,因为我似乎无法找到对此问题的直接答案。

最佳答案

通常,您将使用两种(至少)类型的工具来构建解析器。

第一部分是词法分析——将字符分成标记并过滤掉注释和空格。该部分通常使用正则表达式完成。嗯,更典型的是使用扫描仪生成器来完成,该生成器将正则表达式和代码对的集合转换为程序,该程序在识别正则表达式时执行相应的代码。事实证明,这比每次测试每个正则表达式更有效,并且由于各种其他原因它也更有效。 FLEX 是 C 语言中的常用工具。

解析器的第二部分是语法。最典型的工具是另一个程序生成器,它接受上下文无关语法(CFG),该语法注释有用于解释组件“词性”的规则。 CFG 能够表达诸如平衡括号之类的内容,而正则表达式则不能(除非它已使用 CF 功能进行了扩展,使其在数学意义上不是严格的“正则”)。但是带有规则的 CFG 非常好,因为您可以为语言的短语结构附加语义。 BISON是C语言中这部分的常用工具。

但我实际上告诉了你一个小谎。您会看到,每种真正的编程语言都有无法在上下文无关框架中表达的部分。例如,您需要将变量的定义与其使用联系起来,以便您知道要生成哪些指令,以及对其进行的操作是否合法。这通常被认为超出了解析的范围,但有一些诸如“属性语法”之类的东西,它们就像扩展了 CFG 的功能,甚至可以使这些上下文依赖关系更容易编码和使用。

现在,没有任何规则规定您必须使用此类工具。许多简单的语法很容易使用手写工具进行处理。例如,LISP 的 S 表达式可以简单地扫描为:

如果以数字开头,则读取数字。如果它以字母开头,请读取一个符号。如果是空格,则跳过它。如果它是一个左括号,则跳过它,递归此例程以获得一个值,并期望一个右括号。

嗯,字符串和你拥有的东西还有一些复杂性,但这就是基本思想。解析 FORTH 甚至更简单,因为它不构建递归数据结构。

无论如何,这应该能让你继续你的项目。

关于regex - 正则表达式是否用于构建解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com