Produktionen: Term und Factor |
Top Previous Next |
Beispiele > Rechner > Produktionen: Term und Factor
Die Term-Produktion ist analog der Expression-Produktion aufgebaut, nur dass hier die Multiplikation bzw. Division an Stelle der Addition und Subtraktion stehen:
{{double d;}} Factor[d] {{xd = d;}} ( "*" Factor[d] {{xd *= d;}} |"/" Factor[d] {{ if(d == 0) throw CTT_Error("Division durch Null"); xd /= d; }} )*
Falls der Nenner gleich Null ist, wird das Programm durch den Aufruf von:
throw CTT_Error("Division durch Null");
abgebrochen. Der Text "Division durch Null" wird dann in der Log-Fenster angezeigt.
Die Produktion Factor lautet:
{{ bool bPlus = true; double d; }} ( "-" {{bPlus = false;}} )? ( Number[d] | "(" Expression[d] ")" ) {{ if(bPlus) xd = d; else xd = -d; }}
Wenn der Schalter
zum Einklappen des semantischen Codes betätigt wird, ist die Struktur der Produktion besser zu erkennen:
( "-" )? ( Number | "(" Expression ")" )
Klammerausdrücke denen ein Fragezeichen nachgestellt ist "(...)?" bedeuten in der TETRA-Syntax, dass das was innerhalb der Klammern vorkommt optional ist, also im Text vorkommen kann aber nicht muss. Ein Faktor besteht daher aus einem optionalen Minus-Vorzeichen gefolgt von entweder einer Zahl, die in der Number-Produktion ermittelt wird, oder einem Klammerausdruck. Hier wird der Parser reflexiv. Die Expresssion-Produktion hatte die Term-Produktion aufgerufen, und diese die Factor-Produktion. Innerhalb der Factor-Produktion kann es erneut zu einem Aufruf der Expression-Produktion kommen. Diese Reflexivität spiegelt die mögliche Verschachtelung von Klammern in Rechenausdrücken wieder, z.B. "3 + ((3.2 + 8.9 - 4.6) * 5.6)"
Das Minus-Vorzeichen ist optional. Sein Vorhandensein wird durch eine boolsche Variable festgehalten. Variablen des Typs bool können nur einen der beiden Werte true oder false, d.h. wahr oder falsch enthalten. Die Variable bPlus wird am Beginn der Factor-Produktion deklariert und auf den Wert true gesetzt:
bool bPlus = true;
Wird nun das Minuszeichen an der aktuellen Position im Text gefunden, so wird der Wert der Variablen in false geändert. Nach Auswertung der Number-Produktion oder eines Klammerausdrucks, wird dessen Ergebnis je nach dem Wert der Variablen bPlus belassen wie er ist oder negiert. Hierzu dienen die Anweisungen:
if(bPlus) xd = d; else xd = -d;
Die Struktur
if ( <bedingung> ) <anweisung1>; <anweisung2>;
bedeutet, dass wenn die Bedingung "bedingung" erfüllt ist, d.h. den Wert true hat, die Anweisung "anweisung1" ausgeführt wird und anderenfalls "anweisung2". |
Diese Seite gehört zur TextTransformer Dokumentation |
Home Inhalt English |