2016-04-04 22 views
1

Derleyiciler ve programlama dilleri ile ilgili kavramları öğreniyorum. Nasıl çevirebilirim?EBNF'den BNF'ye çeviri için mücadele ediyorum

Sorun:

<S> → (+ | -)[<C>]{<A>} 

İlk başta, ben böyle tercüme: Ancak

<S> -> epsilon 
    | +<S> 
    | -<S> 
    | <C><S> 
    | <A><S> 

, bunun C üretebileceği bir sorun var!

+0

Sorunuz belirsiz. * Ne * (yeniden?) Üretebilir * C * ve neden bu kadar kötü? Elinizdeki cevabı oluşturduğunuz aşamaları ve her adımın gerekçesini göstermeniz gerçekten yararlı olacaktır. –

cevap

2

Kişisel BNF sürümü sadece aynı zamanda birden + s ve - s (aynı zamanda özgün gramer farklı olurdu veya sıfır) çoklu <C> s üretmek, ama olamaz.

Bu sorunları düzeltmek için, terminal olmayan ek girişler yapmanız gerekir. Spesifik olarak sadece {<A>} ile eşleşen ve [<C>] ile eşleşen bir tane olabilir.

<S> -> + <OptionalC> <RepeatedA> 
    | - <OptionalC> <RepeatedA> 
0

Kişisel EBNF orijinal <S> yılında özyinelemeli değil, ama deneme BNF geçerli: <S> tanımın ardından olabilir. BNF'nin aynı dili üretmesini istiyorsanız, bunu yapmamalısınız. Ayrıca, EBNF'niz epsilon üretemez, bu yüzden bunu <S> üretiminize eklememelisiniz. Diğer cevap söylediği gibi

, ek olmayan terminaller tanıtmak gerekir:

<S> -> <plusminus> <optionalC> <repeatedA> 
<plusminus> -> + | - 
<optionalC> -> <C> | epsilon 
<repeatedA> -> <A> <repeatedA> | epsilon 

Bu orijinal dilbilgisi EBNF elemanlarının basit bir çevirisidir. Ek gereksinimleriniz olsa bile (epsilon-eliminasyon gibi), bu tür bir adımla başlamanız gerekir.

<S> kuralının özyineli olmadığını unutmayın. Ayrıca, bazı ek nonterminaller için epsilon kullanılmasına rağmen, <S> veya <plusminus> kurallarının bir parçası değildir, böylece EBNF orijinalinde olduğu gibi <S> bunu üretemez.

İlgili konular