我有一个家庭作业问题,我可以使用一些帮助。我需要将以下 EBNF 语句转换为 BNF
<S> -> <A>{b<A>}
<A> -> a[b]<A>
到目前为止,这就是我想出的;
<S> -> <A> | <A><S> | b<A>
<A> -> a<A> | ab<A>
感觉不对,主要是因为它是 WAG。我的书(编程语言的概念,Sebesta)中的示例根本没有帮助我。因此,如果有人有任何见解,将不胜感激。谢谢!
第一个语法似乎有问题,或者至少是不必要的混乱。但是请看这里以了解将 EBNF 转换为 BNF 的机械方法:
http://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3.html
您的转换<S>
不完全正确:
<S> -> <A> | <A><S> | b<A>
因为可以在没有原始EBNF规则未定义的<A>
情况下进行递归选择(您只能在它之前进行递归)。b
<A>
b
解决方案可能是:
(* S 是 A 的序列,可选地后跟 b 和 S 的序列。*)
<S> -> <A>
| <A> b <S>;
(* A 由 'a' 组成,后跟一个可选的 'b',然后是另一个 A。*)
<A> -> a <A>
| a b <A>;
这就是我喜欢 EBNF 的原因。它更容易理解和编写!:-)
最终你问自己需要什么。写下来。现在考虑可选组件并使用它们与所需组件的各种组合(当然以正确的顺序)。然后尽可能减少(注意不要犯错误)。