|
Rechner
Das folgende Beispiel beschreibt einen Taschenrechner, der Eingaben
in der Infixnotation akzeptiert. Das Programm muß folgende Grammatik nachbilden, die einen Infixausdruck beschreibt:expr->termexpr + termexpr - termterm->factorterm * factorterm / factor factor -> number
( expr )
Die obige Grammatik beinhaltet auch die unterschiedliche Wertigkeit
und die Assoziativität der Operatoren. Das zugehörige Programm sieht
folgendermaßen aus:
# Infix Rechner
# Das Hauptprogramm wird nur auf die aktuelle Eingabezeile
# angewendet, wenn sie mehr als ein Feld beinhaltet. D. h.
# in jeder Zeile darf nur ein Ausdruck stehen und seine
# Operanden muessen von Leerzeichen eingeschlossen werden.
# z. B. ( 5 + 2 ) * 3
NF > 0 {
f = 1
e = expr()
if (f <= NF) printf("error at %s\n", $f)
else printf("\t%.8g\n", e)
}
# Unterprogramme, die zur Erkennung der Struktur des
# Ausdrucks verwendet werden.
function expr( e) { # term | term [+-] term
e = term()
while ($f == "+" || $f == "-")
e = $(f++) == "+" ? e + term() : e - term()
return e
}
function term( e) { # factor | factor [*/] factor
e = factor()
while ($f == "*" || $f == "/")
e = $(f++) == "*" ? e * factor() : e / factor()
return e
}
function factor( e) { # number | (expr)
if ($f ~ /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$/) {
return $(f++)
} else if ($f == "(") {
f++
e = expr()
if ($(f++) != ")")
printf("error: missing ) at %s\n", $f)
return e
} else {
printf("error: expected number or ( at %s\n", $f)
return 0
}
}
|
|
|