2009-05-11 10 views

Odpowiedz

27

rozważenia:

A ::= A B 

odpowiednik kod jest

boolean A() { 
    if (A()) { 
     return B(); 
    } 
    return false; 
} 

zobaczyć nieskończoną rekurencję?

16

dla tego, kto jest zainteresowany

A ::= A B | A C | D | E 

może być zapisane jako:

A ::= (D | E) (B | C)* 

Ogólna postać przemiana: każdy jeden z nie lewej disjuncts rekurencyjnych następuje dowolny numer lewej rekursywne disjunkty bez pierwszego elementu.

Reformowanie kodu akcji jest trochę podstępne, ale ja też mogę być plug-n-chug.

+0

Po raz pierwszy zobaczyłem, że zawsze widziałem porady, aby użyć nowego nie-terminala, zwykle nazywanego A ' –

+0

Cóż, niektóre narzędzia oparte na BNF nie pozwolą() na grupy, więc w końcu utkniesz z nowym rozwiązaniem reguł . Jestem trochę stronniczy od proponowanej przeze mnie formy, ponieważ mój generator parsera również musi wykonać transformację akcji, więc znacznie łatwiej jest działać bez nowej reguły. – BCS

+1

To naprawdę nie odpowiada na pytanie. Byłoby lepiej jako komentarz. –

Powiązane problemy