Ich lese gerade "Programmierung: Prinzipien und Praxis mit C++" von Bjarne Stroustrup und ich habe Probleme zu verstehen, wie diese bestimmte Grammatik implementiert ist. HierWie funktioniert dieser C++ Parser?
ist die Grammatik und seine Regeln:
Expression:
Term
Expression "+" Term
Expression "-" Term
Term:
Primary
Term "*" Primary
Term "/" Primary
Term "%" Primary
Primary:
Number
"(" Expression ")"
Number:
floating-point literal
Dies ist jedoch, wie Zeit implementiert:
double term()
{
double left = primary();
Token t = ts.get(); // get the next token from token stream
while(true) {
switch (t.kind) {
case '*':
left *= primary();
t = ts.get();
break;
case '/':
{
double d = primary();
if (d == 0) error("divide by zero");
left /= d;
t = ts.get();
break;
}
default:
ts.putback(t); // put t back into the token stream
return left;
}
}
}
Warum wir in der switch-Anweisung, left *= primary();
nennen, wenn das Token gleich "*" anstelle von left *= term()
?
Ich habe versucht, left *= primary();
durch left *= term()
zu ersetzen (tat das gleiche für Division) und das Programm funktionierte immer noch gut. Ich verstehe jedoch nicht die Design-Entscheidung, die Bjarne im Sinn hatte, das heißt, warum er die Funktion so implementiert hat, wie er es getan hat. Vielleicht vermisse ich hier etwas?
Vielen Dank im Voraus!
Dies ist keine "C++ Grammatik". Dies ist ein in C++ implementierter Parser. – EJP
@BeyelerStudios: Das hat nichts mit der Reihenfolge der Auswertung zu tun. [Es ist wichtig, die Bewertungsreihenfolge nicht zu verwechseln.] (Http://programmers.stackexchange.com/a/300808/17853) –