繁体   English   中英

是否有正则语言来表示正则表达式?

[英]Is there a regular language to represent regular expressions?

具体来说,我注意到正则表达式本身的语言不是正则的。 所以,我不能使用正则表达式来解析给定的正则表达式。 我需要使用解析器,因为正则表达式本身的语言是上下文无关的。

有没有什么方法可以用正则表达式解析结果字符串的方式来表示正则表达式?

注意:我的问题不是关于是否有一个正则表达式来匹配正则表达式的当前语法,而是是否存在我们今天所知道的正则表达式的“表示”(可能不像我们今天所知道的那样简洁)可以使用正则表达式解析。 另外,请有人删除重复项,因为它不是重复项。 我问的是完全不同的东西。 我已经知道当前的正则表达式语言不是正则的(这就是我最初提出问题的方式)。

根据“代表”的含义,答案是“是”或“否”:

如果你想要一种(同态)映射到通常的基本正则表达式语言的语言,答案是否定的,因为正则语言不能与非正则语言同构,而标准正则表达式语言是非正则的. 这是因为语法需要匹配任意深度的左括号和右括号。

如果“代表”仅意味着指定常规语言的另一种方法,那么答案是肯定的,现在我至少可以想到三种方法来实现这一点:

  1. “最愚蠢”和最简单的方法是定义一些满射映射f : ℕ -> RegEx从自然数到所有有效标准正则表达式的集合。 您可以使用正则表达式0|1[01]*定义自然数,用(表示)自然数n字符串表示的n则语言是f(n)表示的正则语言。

    当然,自然数的意义对于人类读者来说根本不明显,所以这种“正则表达式语言”将毫无用处。

  2. 由于括号是简单正则表达式中唯一的非正则部分,最简单的人类可解释的方法是扩展标准的简单正则表达式语法以允许悬空括号并定义悬空括号的语义。

    显而易见的选择是忽略不匹配的左括号并将不匹配的右括号解释为匹配正则表达式的开头。 这基本上相当于在正则表达式的开头隐式插入尽可能多的左括号,并在正则表达式的末尾插入尽可能多的右括号。 此外, (*必须被解释为空字符串的重复。如果我没有遗漏任何东西,这个定义应该将任何字符串转换为具有指定含义的“正则表达式”,因此.*定义了这个“正则表达式语言”。

    该变体甚至具有与标准正则表达式相同的抽象语法。

  3. 另一种变体是指定直接使用常规语言识别语言的 NFA,例如: ([az]+,([^,]|\\\\,|\\\\\\\\)+,[az]+\\$?;)*

    这个想法是[az]+用作状态的标签,表达式是从源状态s到目标状态t消耗字符c的转换三元组(s, c, t)的列表,以及表示接受转换的$ (参见下面的注释)。 c ,反斜杠用于转义逗号或反斜杠 - 我假设您对标准正则表达式使用相同的字母表,但当然您可以用任何其他正则语言的符号替换中间组件,这些符号表示您希望的任何字母表的字符。 提到的第一个源状态是(单个)初始状态。 空表达式定义空语言。

    上面,我写了“接受转换”,而不是“接受状态”,因为这会使上面的正则表达式更加复杂。 您可以将包含$的三元组解释为两个转换,即一个转换消耗cs到一个新的唯一状态,以及一个从该状态到t的 ε-转换。 这应该允许任何 NFA 被表示,通过用$三元组替换每个到接受状态的转换,并用非$三元组替换每个到非接受状态的转换。

一个可能使“是”部分看起来更直观的注释:汇编语言是常规的,甚至是图灵完备的,因此如果无法使用常规语言指定“纯粹的”常规语言,那将是出乎意料的。

答案可能是否定的。

正如您所指出的,所有可能的正则表达式集本身并不是一个正则集。 任何TRUE正则表达式(不是那些扩展的)都可以转换为有限自动机 (FA)。 如果正则表达式可以用自己可以解析的形式表示,那么FA也可以用正则表达式解析。

但据我所知,这是不可能的。 RE本身可以简化为三个基本操作(根据龙书):

  1. 串联:例如ab
  2. 交替:例如a|b
  3. kleen 闭合:例如a*

kleen 闭包可以匹配无限多个字符,但它不知道要匹配多少个字符。 想想这样的情况:你想匹配 3 个连续的a s。 那么对应的正则表达式是/aaa/ 但是如果你想要 match 4, 5, 6 ... a s 呢? 解析器只有一个RE无法知道确切的数字a秒。 因此它无法为任意表达式提供正确的匹配。 但是,RE 解析器必须匹配无限不同形式的 RE。 根据您的表达式,正则表达式无法匹配所有可能性。

嗯,RE 解析器的唯一区别是它不需要分词器。(可能这就是在词法分析中使用 RE 的原因) RE 中的每个字符都是一个标记(不包括那些转义字符)。 但是要解析 RE,无论它转换什么,都必须面对 NFA/DFA/TREE...所有 RE 本身无法解析的等效结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM