Class | Grammar |
In: |
Compilerbau2.rb
|
Parent: | Object |
Diese Klasse repräsentiert eine Komplette Grammatik. Sie hat ein ein Atribut für das Startsymbol und jeweils ein Hash-wertiges Attribut für die Teminale, Non-Terminale und die Regeln. Die Schlüssel für (Non-) Terminale sind die Namen der Symbole und für die Regeln das Non-Terminal welches auf der linken Seite der Regel steht.
Der Konstruktor der Grammatik bekommt den Regelteil einer SIC-Grammatik als String übergeb und spaltet ihn an einer Leerzeile in die einzelne Regel, welche wiederum an den Konstruktor von Rule übergeben wird. Die so entstehenden Regeln kommen in den @rules-Hash. Das Symbol der ersten Regel wird das Startsymbol der Grammatik, alle anderen linksseitigen Symbole sind die Non-Terminale. Die Terminale ergeben sich aus allen Symbolen der zu allen Regeln gehörigen Alternativen die nicht vom Namen her mit einem Non-Terminal übereinstimmen.
(Bei genauer Betrachtung stellt man fest, dass so immer nur ein gleichnamiges Symbol in dem Hash steht. Da Symbole gleichen Namens aber an und für sich gleich sind stört diese Verwerfung nicht.)
Diese Methode ermöglicht es eine in einer Datei abgespeicherte Grammatik wieder zu laden. Ein mögliches vorgehen wäre, in dem man eine leere Grammar erstellt und davon die Methode Grammar#load_grammar
aufruft. Zum Beispiel: | g = Grammar.new("") g.load("/home/alex/SavedGrammar.yaml") |
Grammar#load(file) - Der Pfad zu der Datei in Form eines String, in der die Grammatik gespeichert ist.
Diese Methode ermöglicht das Speichern der Grammatik in eine Datei. Als Format wird YAML ( www.yaml.org/ ) benutzt, somit ist die Datei im Plaintext und kann auch mit einem einfachem Editor bearbeitet werden. Vorsicht: Dabei kann man die Formatierung beschädigen, so dass die gespeicherte Grammatik nicht mehr geladen werden kann. file - Der Pfad zu der Datei in Form eines Strings, in der die Grammatik gespeichert werden soll. Sollte die Datei nicht vorhanden sein, wird sie erstellt. Ansonsten wird die Datei überschrieben!
Diese Methode stellt eine SIC-compatible Grammatik in Form eines Strings her. Zu Beginn werden die terminalen Zeichen aufgelistet, gefolgt von den nichtterminalen Zeichen, dem Startsymbol und zum Schluss den Ableitregeln. Vor jedem Abschnitt leitet eine Überschrift die jeweiligen Zeichen ein, der noch eine zusätzliche Leerzeile folgt.