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