2009-05-11 10 views

Antwort

27

betrachten:

A ::= A B 

der entsprechende Code

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

ist die unendliche Rekursion sehen?

16

Denn wer interessiert

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

kann wie folgt umgeschrieben werden:

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

Die allgemeine Form der Transformation ist: eine der nicht links rekursive Disjunktionen von einer beliebigen Anzahl von links gefolgt Rekursive Disjunkte ohne das erste Element.

Die Reform des Action-Code ist ein bisschen Trickery, aber ich denke, dass Plug-n-Tuck auch sein kann.

+0

Zum ersten Mal sah ich Ratschläge, ein neues Nicht-Terminal zu verwenden, normalerweise A ' –

+0

Nun, einige BNF-basierte Tools erlauben keine() Gruppen, so dass Sie mit der neuen Regellösung stecken bleiben . Ich bin ein bisschen zu der Form, die ich vorgeschlagen habe, weil mein Parser-Generator auch die Aktionstransformation ausführen muss, so dass es viel einfacher ist, es ohne eine neue Regel arbeiten zu lassen. – BCS

+1

Das beantwortet die Frage nicht wirklich. Wäre besser als Kommentar. –

Verwandte Themen