2016-03-24 11 views
1

ich etwas bedeuten wieGibt es jede Änderung von BNF mit Parametern

LISTOF(EL) := "[" EL ("," EL)* "]" 
LISTNUM := LISTOF(NUMBER) 
LISTID := LISTOF(IDENT) 

so, mit Definitionen

NUMBER := ('0'-'9')* 
IDENT := ('a'-'z'|'A'-'Z')* 

wir

[435,657,44] folgende haben, ist Beispiel für LISTNUM,

[dsf,thg,ewre] ist ein Beispiel für LISTID.

Oder ein anderes Beispiel (e bedeutet leere Zeichenkette)

A(0) := e 
A(n) := "a" A(n-1) | e 

so, A (5) aller Strings gesetzt bestehen aus 'a' mit einer Länge von nicht mehr als 5

es irgendwelche Wissenschaft Arbeiten, die etwas Ähnliches beschreiben? Können wir unsere Grammatiken so beschreiben und trotzdem in akzeptabler Zeit parsen?

+1

Natürlich können Sie das * tun *. Eine einfache Möglichkeit besteht darin, Ihre parametrisierten BNF-Regeln als Makros zu behandeln und sie einfach auf konventionelle BNF-Regeln zu erweitern. Die Frage ist * solltest * du das tun? Kauft die zusätzliche Ausdruckskraft in der Praxis etwas? Ich habe viele Grammatiken gebaut; Ich denke nicht. YMMV. –

Antwort

0

Die häufig verwendeten Metasyntaxen wie Bnf, Abnf und Ebnf haben keine parametrisierten Regeln. Iso Ebnf ist jedoch gemäß dem Standard erweiterbar. Wenn ich mich richtig erinnere, zeigt der Standard tatsächlich ein Beispiel für die Einführung von Parametern.

Sie können den Standard here kostenlos erhalten.