2009-05-11 5 views

Répondre

27

considèrent:

A ::= A B 

le code équivalent est

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

voir la récursion infinie?

16

Car celui qui est intéressé

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

peut être réécrite comme:

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

La forme générale de la transformation est: une quelconque des disjoints récursif non gauche suivie d'un nombre quelconque de gauche disjonctions récursives sans le premier élément.

Réformer le code d'action est un peu rusé mais je pense que cela peut aussi être plug-n-chug.

+0

La première fois que j'ai vu ça, j'ai toujours vu des conseils pour utiliser un nouveau terminal non-terminal, généralement appelé A ' –

+0

Bien certains outils basés sur BNF ne permettent pas() de se retrouver avec la nouvelle règle . Je suis un peu partial par rapport à la forme que j'ai proposée car mon générateur d'analyseur doit aussi faire la transformation de l'action, donc il est beaucoup plus facile de le faire fonctionner sans nouvelle règle. – BCS

+1

Cela ne répond pas vraiment à la question. Serait mieux comme commentaire. –

Questions connexes