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