Regex 这个上下文无关语法是正则表达式吗?

Regex 这个上下文无关语法是正则表达式吗?,regex,bnf,context-free-grammar,Regex,Bnf,Context Free Grammar,我的语法定义如下: A -> aA*b | empty_string A -> aA*b (using 1) aAb -> ab (using 2) A是正则表达式吗?我对如何解释BNF语法感到困惑。a似乎是BNF语法规则。我不太清楚为什么要把它和正则表达式混淆。你是不是因为里面有个*而感到困惑?所有有*的东西都不是正则表达式 不,这个问题实际上与正则表达式无关。上下文无关语法指定正则表达式无法描述的语言 这里,A是非终端;也就是说,它是一个符号,必须通过产生式规则进行扩展

我的语法定义如下:

A -> aA*b | empty_string
A -> aA*b (using 1)
aAb -> ab (using 2)

A
是正则表达式吗?我对如何解释BNF语法感到困惑。

a似乎是BNF语法规则。我不太清楚为什么要把它和正则表达式混淆。你是不是因为里面有个*而感到困惑?所有有*的东西都不是正则表达式

不,这个问题实际上与正则表达式无关。上下文无关语法指定正则表达式无法描述的语言

这里,
A
是非终端;也就是说,它是一个符号,必须通过产生式规则进行扩展。鉴于您只有一条规则,它也是您的开始符号-此语法中的任何产品都必须以
A
开头

产生式规则是

(1)    A -> aA*b | 
(2)         empty_string
a
b
是终端符号-它们在语言的字母表中,不能扩展。当左侧没有更多的非终结符时,就完成了

因此,这种语言指定的单词类似于平衡圆括号,除了使用
a
b
而不是

例如,您可以生成
ab
,如下所示:

A -> aA*b | empty_string
A -> aA*b (using 1)
aAb -> ab (using 2)
类似地,您可以生成
aabb

A -> aA*b (1)
aAb -> aaA*bb (1)
aaAbb -> aabb (2)
A -> aA*b
aA*b -> aabA*b:
aaba*b -> aababA*b:
aababA*b: -> aababb
甚至
aababb

A -> aA*b (1)
aAb -> aaA*bb (1)
aaAbb -> aabb (2)
A -> aA*b
aA*b -> aabA*b:
aaba*b -> aababA*b:
aababA*b: -> aababb

明白了吗?星型符号可能有点混乱,因为您在正则表达式中看到过它,但实际上它在这里和那里做的事情是一样的。它被称为Kleene闭包,它表示可以使用0或更多
a
s生成的所有单词。

正则表达式生成正则语言,并可以使用状态机进行解析

BNF语法是生成上下文无关语言的上下文无关语法,可以使用下推自动机(堆栈机器)进行解析


上下文无关语法可以完成常规语法所能做的一切,甚至更多。

让我困惑的是,我们的左右两边都有一个。*在正则表达式中绝对是一个符号,因为它告诉你a重复0次或更多次。“所有有*的东西都不是正则表达式。”不,有些有*的东西是正则表达式。我想你的意思是,并不是所有包含*的东西都是正则表达式。@danben:只有对游戏评级比解决方案更感兴趣的人。