EBNF到BNF转换

时间:2010-01-25 01:44:17

标签: bnf ebnf

我有一个家庭作业问题,我可以使用一些帮助。我需要将以下EBNF语句转换为BNF

<S> -> <A>{b<A>}
<A> -> a[b]<A>

这是我到目前为止所提出的;

<S> -> <A> | <A><S> | b<A>
<A> -> a<A> | ab<A>

感觉不对,主要是因为它是WAG。我的书(概念编程语言,Sebesta)中的例子根本没有帮助我。因此,如果任何人有任何见解,将不胜感激。谢谢!

2 个答案:

答案 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的原因。理解和写作要容易得多! : - )

最终你会问自己需要什么。写下来。现在考虑可选组件,并使用它们与所需组件的各种组合(当然按照正确的顺序)。然后减少你所能做的事情(注意不要犯错)。

相关问题