这只是出于好奇的一个问题,因为我最近需要越来越多地解析和使用正则表达式。似乎,对于我在搜索中遇到的有关某种解析的问题,有人总是最终说,当问一些与正则表达式相关的问题,“正则表达式对此不好,请使用这样那样的解析器”...因为我已经更好地理解了正则表达式,我认为大多数东西都是可能的,只是它相当复杂且耗时,因为你必须考虑许多不同的可能性,当然,它必须与条件语句和循环结合起来才能构建任何类型的解析器..所以我想知道正则表达式是否用于构建大多数解析器或者是否还有其他一些正在使用的方法..我只是想知道,因为我可能需要构建一些相当复杂的自定义解析器,但不一定有现有的解析器可供使用。
感谢您提供任何信息,因为我似乎无法找到此问题的直接答案。
通常,您将使用两种(至少)类型的工具来构建解析器。
第一部分是词法分析——将字符分成标记并过滤掉注释和空格。该部分通常使用正则表达式完成。嗯,更典型的是使用扫描仪生成器来完成,该生成器将正则表达式和代码对的集合转换为程序,该程序在识别正则表达式时执行相应的代码。事实证明,这比每次测试每个正则表达式更有效,并且由于各种其他原因它也更有效。 FLEX 是 C 语言中的常用工具。
解析器的第二部分是语法。最典型的工具是另一个程序生成器,它接受上下文无关语法(CFG),该语法注释有用于解释组件“词性”的规则。 CFG 能够表达诸如平衡括号之类的内容,而正则表达式则不能(除非它已使用 CF 功能进行了扩展,使其在数学意义上不是严格的“正则”)。但是带有规则的 CFG 非常好,因为您可以为语言的短语结构附加语义。 BISON是C语言中这部分的常用工具。
但我实际上告诉了你一个小谎言。您会看到,每种真正的编程语言都有无法在上下文无关框架中表达的部分。例如,您需要将变量的定义与其使用联系起来,以便您知道要生成哪些指令,以及对其进行的操作是否合法。这通常被认为超出了解析的范围,但有一些诸如“属性语法”之类的东西,它们就像扩展了 CFG 的功能,甚至可以使这些上下文依赖关系更容易编码和使用。
现在,没有任何规则规定您必须使用此类工具。许多简单的语法很容易使用手写工具进行处理。例如,LISP 的 S 表达式可以简单地扫描为:
如果以数字开头,则读取数字。
如果它以字母开头,请读取一个符号。
如果是空格,则跳过它。
如果它是一个左括号,则跳过它,递归此例程以获得一个值,并期望一个右括号。
嗯,对于字符串和其他东西来说还有一些复杂的情况,但这就是基本的想法。解析 FORTH 甚至更简单,因为它不构建递归数据结构。
不管怎样,无论你的项目是什么,这都会让你继续下去。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)