Class | Rule |
In: |
Grammatiken.rb
|
Parent: | Object |
Diese Klasse repräsentiert die einzelnen Regeln. Jede Regel besteht aus einem Symbol als linker Regelseite und einem Array mit Alternativen als rechter Seite der Regel.
Die Methode erzeugt Ausdrucksgrammatiken aus Kurzangaben.
* Die Kurzangaben sind eine Folge von Zeilen, die jeweils ein Operatortoken (z.B. addOp) in seinen Eigenschaften beschreiben. * Bei binären Operatortoken hat die Zeile den Aufbau: <Assoc> <Operator>; <Assoc> steht für left, right oder none und legt die Assoziativität des Operators fest; none besagt, daß keine Assoziativität vorliegt und daher bei mehr als einem Operator voll geklammert werden muß. * Bei unären Operatortoken hat die Zeile den Aufbau: <Pos> <Operator>; <Pos> steht für pre oder post und legt fest, ob der Operator vor oder nach dem Operanden steht. * Die Operatorzeilen sind nach wachsender Präzedenz angeordnet, d.h. die erste Zeile gehört zu dem Operatortoken, das am schwächsten bindet. * Die letzte Zeile hat die Form: atom <token 1 >, ..., <tokenN> und führt die atomaren Bestandteile des Ausdrucks ein. * Die erste Zeile hat die Form: name <Bezeichner> und führt den Namen der Ausdrucksgrammatik ein, mit dem alle erzeugten Nonterminals beginnen.
Der Konstruktor einer Regel bekommt einen String mit der kompletten Regel übergeben. Dieser wird am Trennzeichen -> in die linke und rechte Seite geteilt. Die linke Seite wird dem Konstruktor von Symb übergeben und das neue Symbol im @symbol-Attribut abgelegt. Die rechte Seite wird weiter zerlegt in die verschiedenen Alternativen (Nach Zeilenumbruch beliebiger Einrückung und dem Zeichen |). Diese werden wiederum dem Konstruktor von Alternative übergeben und die so entstehenden Alternativen in das @alts-Array gepackt.
Operator der den Zugriff auf die einzelnen Alternativen der Regel ermöglicht. regel[i] liefert das Symbol das im @alts-Array an Index i liegt.
Diese Methode liefert einen boolschen Wert (true oder false) zurück, ob aus dieser Regel das Leerezeichen Epsilon erzeugt werden kann. Dazu muss Epsilon entweder direkt ableitbar sein.
Die to_s Methode, die eine Regel in einem String ausgibt. Auf der linken Seite des Pfeiles ( "->" ) steht das Non-Terminal. Rechts davon stehen dann die Alternativen, die jeweils durch einen "|" getrennt sind. Jede einzelne Alternative steht in einer neuen Zeile. Die einzelnen Alternativen, Trennzeichen und das linke Symbol sind durch Leerzeichen getrennt.