Ich lerne gerade syntaktische Analyse. Ich versuche, eine metagrammar zu machen, die diese bestimmte Grammatik erzeugen könnten:Wie erstelle ich einen Metagrammar?
A ⇒ A '+' C | C ;
C ⇒ C * Q ;
C ⇒ Q ;
Q ⇒ a | b | 'A' | "B" | "(" A ")" | <num> ;
<num> ⇒ <Signed Int> | Float ;
<Signed Int> ⇒ Signe Int ;
Signe ⇒ '-' | '+' | ~eps~
<Int> ⇒ Digit Int | Digit ;
Digit ⇒ '1' | '2' | '3' | '4' | 5 | 6 | 7 | 8 | "9" | "0" ;
Float ⇒ Int '.' Int ;
Wo <>
ignoriert werden (das heißt <int>
ist die gleiche wie int
), Einzel-/doppelte Anführungszeichen sind für eine Zeichenfolge, ~eps~
für Epsilon ist. Alles andere wird als Symbol betrachtet (ob es sich um ein Terminal oder ein Nonterminal handelt).
Zur Zeit habe ich so etwas wie diese:
S ⇒ left "⇒" right ";" | ε
left ⇒ symb | "<"symb">"
right ⇒ QP
Q ⇒ symb | """symb""" | "'"symb"'" | "<"symb">" | ε
P ⇒ symb | '|' Q | ε
Aber es fühlt sich für mich so falsch und ich bin nicht so sicher, was zu tun ist. Gibt es eine Methode zur Bestimmung eines Metagrammars? Wie könnte ich über diesen gehen?
Sollte am Ende der Zeile ein '' 'stehen mit' Signe ⇒ '-' | '+' | ~ eps ~ '? –