1

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

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

到目前为止,这就是我想出的;

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

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

4

2 回答 2

1

第一个语法似乎有问题,或者至少是不必要的混乱。但是请看这里以了解将 EBNF 转换为 BNF 的机械方法:

http://lampwww.epfl.ch/teaching/archive/compilation-ssc/2000/part4/parsing/node3.html

于 2010-06-21T06:06:01.837 回答
1

您的转换<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 的原因。它更容易理解和编写!:-)

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

于 2013-07-20T21:12:04.160 回答