Javascript 如何将带有递归和交替的正则语法转换为正则表达式

Javascript 如何将带有递归和交替的正则语法转换为正则表达式,javascript,ecmascript-next,compiler-construction,Javascript,Ecmascript Next,Compiler Construction,如果语法是右线性或左线性的,那么它就是正则的。声称因此具有特殊属性: 正则语法有一个特殊的属性:通过替换 非终结符(根一除外)及其右侧,您可以 将其减少到根目录的单个生产,只需 右侧的终端和操作员。。。减少 终端和运算符的表达式可以用更简单的语言编写 紧凑形式,称为正则表达式 所以我决定测试这个想法,并将正则表达式转换为正则表达式: IdentifierName :: IdentifierStart IdentifierName IdentifierPart 假设Identi

如果语法是右线性或左线性的,那么它就是正则的。声称因此具有特殊属性:

正则语法有一个特殊的属性:通过替换 非终结符(根一除外)及其右侧,您可以 将其减少到根目录的单个生产,只需 右侧的终端和操作员。。。减少 终端和运算符的表达式可以用更简单的语言编写 紧凑形式,称为正则表达式

所以我决定测试这个想法,并将正则表达式转换为正则表达式:

IdentifierName ::
    IdentifierStart
    IdentifierName  IdentifierPart
假设
IdentifierStart
IdentifierPart
仅限于以下内容:

IdentifierStart ::       IdentifierPart ::
    A                        A                 
    B                        C
    C                        &
    $                    
    _
但是我不知道如何继续,因为
IdentifierName
的语法既有递归也有交替。有什么帮助吗


我更感兴趣的是这种方法,而不是找到结果regexp,正如@Bergi所示,它是
[ABC$\][AC&]*

该教程使用了一些非标准(令人惊讶的是隐式)定义

首先,它们在语法中使用重复运算符,就像在正则表达式或EBNF中一样。然后,它们隐式地定义了一个只使用那些重复运算符而不使用递归的正则语法。有鉴于此,只需内联所有非终结符,就可以将“正则语法”转换为正则表达式。但是根据这个定义,JS规范的标识符语法是不规则的,因为它包含递归。因此,在内联所有内容之前,首先需要用重复运算符替换递归

然而,这不是什么是常规语法的标准定义。标准定义如你所说:如果文法是左线性或右线性的,那么它就是规则的——也就是说,如果一个产品中最左边的项目是非终端的,或者只有最右边的项目是非终端的。形式语法的通常定义中不存在重复运算符

现在,这些正则语法也可以转换为正则表达式,但不仅仅是应用教程中描述的方法。一种方法是将语法转换为有限自动机,然后应用示例中描述的算法


然而,在实践中,当手动进行转换时(而不是编写程序来进行转换),执行转换的最简单和最常见的方法是考虑语法描述的语言(在本例中为“以IdentifierStart符号开始,然后包含0个或多个IdentifierPart符号的所有单词的语言”)然后产生一个表示该语言的正则表达式(也称为“仔细研究问题,直到找到解决方案”-算法)。

IdentifierName要么是IdentifierName,后跟IdentifierPart,要么是IdentifierStart,如果IdentifierStart是S,IdentifierPart是p,那么一些合法的IdentifierName就是S,SP、SPP等。。。你能想出一个正则表达式来满足这个要求吗?只需
[ABC$\][AC&]*
@Bergi,谢谢,但我更感兴趣的是替换方法,而不是正则表达式本身。或者这个例子是不是太简单了,以至于不需要遵循这个方法就可以得到regexp?@M.Aroosi,谢谢,请看谢谢,那么这个算法是否有效:1)用重复运算符替换递归,然后2)用右手边替换每个非终结符(根除外)?或者第一部分通过应用机械方法真的不是很简单吗?我还写了一个语法,如果它是右线性或左线性的,那么它就是正则的。本教程声称,正因为如此。。。。因此,似乎不是因为替换算法会起作用,而是因为重复运算符?@AngularInDepth.com是的,该算法会起作用,但在一般情况下,“用重复运算符替换递归”绝对不是一个简单的步骤。您的第二条评论也是这样:替换算法之所以有效,是因为它们将正则语法定义为仅使用重复运算符而不是递归的语法,而不是左线性或右线性语法(这是通常的定义)。