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:只有对游戏评级比解决方案更感兴趣的人。