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