我的语法定义如下:
A -> aA*b | empty_string
A
是正则表达式吗?我对如何解释BNF语法感到困惑。
答案 0 :(得分:8)
不,这个问题实际上与正则表达式无关。无上下文语法指定了正则表达式无法描述的语言。
这里,A
是非终端;也就是说,它是必须通过生产规则扩展的符号。鉴于您只有一个规则,它也是您的起始符号 - 此语法中的任何产品都必须以A
开头。
制作规则是
(1) A -> aA*b |
(2) empty_string
a
和b
是终端符号 - 它们位于语言的字母表中,无法展开。当你的左手边没有更多的非终结者时,你就完成了。
因此,此语言指定的词语类似于平衡括号,但a
和b
代替(
和)
除外。
例如,您可以按如下方式生成ab
:
A -> aA*b (using 1)
aAb -> ab (using 2)
同样,您可以生成aabb
:
A -> aA*b (1)
aAb -> aaA*bb (1)
aaAbb -> aabb (2)
甚至aababb
:
A -> aA*b
aA*b -> aabA*b:
aaba*b -> aababA*b:
aababA*b: -> aababb
得到它?明星符号可能有点令人困惑,因为你已经在正则表达式中看到它,但实际上它在那里做同样的事情。它被称为Kleene-closure,它表示您可以用0或更多A
s表示的所有单词。
答案 1 :(得分:2)
正则表达式生成常规语言,可以使用状态机进行解析。
BNF语法是无上下文语法,它可以生成无上下文语言,可以使用Push Down Automata(堆栈机器)进行解析
Context Free Grammars可以做所有常规语法可以做的事情。
答案 2 :(得分:0)
A似乎是BNF语法规则。我不确定你为什么把它与正则表达式混淆了。你有困惑因为它里面有*吗?所有带*的东西都不是正则表达式。