Wie ist dann zum Beispiel folgendes zu interpretieren?
Code: Alles auswählen
expr ::= term | term + expr
Code: Alles auswählen
expr ::= term | term + expr
Code: Alles auswählen
expr ::= term | term + expr
term ::= factor | factor * term
factor ::= number | (expr)
Nach BNF Regeln eigentlich nichtmal das. Bei BNF werden Non Terminals eigentlich in <> gesetzt.deets hat geschrieben: Die Beispiele sind eine Standardkonstruktion fuer arithmetische Ausdruecke mit Addition und Multiplikation.
Code: Alles auswählen
expr ::= number | '(' expr ')' | expr op expr
op ::= '+' | '*'
Ich denke, so weit hab ich BNF schon verstanden. IMHO müsste es heißenBlackJack hat geschrieben:@burli: Du hast da eigentlich doch Terminale drin, es sei denn Du definierst +, *, und die Klammern noch mal als Nicht-Terminale die einfach nur für das jeweilige Zeichen als Terminal stehen.
Code: Alles auswählen
<expr> ::= <term> | <term> + <expr>
Nein, mein Problem ist es eigentlich, eine entsprechende Definition für die Begriffe term, expression oder factor zu finden.deets hat geschrieben:Deine Verstaendnisprobleme ruehren aber doch nicht daher, oder?
Code: Alles auswählen
<expr> ::= <term> | <term> + <expr>
<term> ::= <faktor> | <faktor> * <term>
<factor> :: = <number> | "(" <expr> ")"
<number> ::= "0" | "1"
Code: Alles auswählen
<expr> -> <term> + <expr> -> <faktor> + <expr> -> <number> + <expr> -> 0 + <expr> -> 0 + <faktor> * <term> -> 0 + <number> * <term> -> 0 + 1 * <term> -> 0 + 1 * <factor> -> 0 + 1 * ( <expr> ) -> 0 + 1 * ( <term>) -> 0 + 1 * (<faktor>) -> 0 + 1 * ( <number> ) -> 0 + 1 * ( 0 )
Vielleicht werfe ich Grammatik und Mathematik durcheinander. Vielleicht beziehe ich mich zu stark auf die Mathematik, weil es sich bei dem Beispiel um die Auflösung von mathematischen Ausdrücken geht.deets hat geschrieben:Worum es hier geht, hat BlackJack schon angedeutet: es geht nicht um sauber definierte Begriffe aus der Mathematik. In der ist ja wohl auch kaum der Zugriff zB auf Objekt-Attribute zu finden, wie es einen in einer Programmiersprache interessiert.
Sondern um grammatikalische Regeln, welche dir einen Ausdruck zerlegen in einen dazugehoerigen abstrakten Syntax Baum oder etwas aehnliches. Und da muss man - je nach Parser - unterschiedliche Klimmzuege machen, um das gewuenschte Ergebnis zu erreichen.
Ich denke nicht, dass es die eine feste Syntaxform für BNF gibt. RFC 2234 bzw. 4234 bzw. 5234 beschreibt z.B. einen Vorschlag, wo keine <> vorkommen. Gerne werden auch Terminal-Symbole in " eingeschlossen - in Anlehnung an Wirths EBNF glaube ich. Ich habe auch schon gesehen, dass GROSSBUCHSTABEN benutzt werden und Nicht-Terminal-Symbole dann mit einem Kleinbuchstaben anfangen. Oder man schreibt diese zur Unterscheidung kursiv.burli hat geschrieben:Nach BNF Regeln eigentlich nichtmal das. Bei BNF werden Non Terminals eigentlich in <> gesetzt.
Ok, dass war mir soweit schon klar. Für den Computer bzw den Parser ist das alles ein Blabla. Es ging mir ja auch darum zu verstehen, was sich die Menschen dabei gedacht haben, als sie diese Begriffe gewählt haben.sma hat geschrieben:Es sind nur Namen, die nur für einen Menschen Bedeutung haben, nicht für den Computer. Es gibt keine festgelegte Standardbedeutung.
Das, was dir schon mehrfach gesagt wurde: eine Definition von Ausdruecken fuer Infix-Operation unter Beruecksichtigung vonburli hat geschrieben:Ok, dass war mir soweit schon klar. Für den Computer bzw den Parser ist das alles ein Blabla. Es ging mir ja auch darum zu verstehen, was sich die Menschen dabei gedacht haben, als sie diese Begriffe gewählt haben.sma hat geschrieben:Es sind nur Namen, die nur für einen Menschen Bedeutung haben, nicht für den Computer. Es gibt keine festgelegte Standardbedeutung.