name bezeichnet syntaktisches Element
{} bezeichnet Folgen von Elementen (evtl. leer)
() bezeichnet notwendige Elemente
| bezeichnet Auswahl
[] bezeichnet optionale Elemente
"terminal" bezeichnet Terminalsymbole
= bezeichnet Produktionen
:=, Bezeichner (identifier),
Kommentare, Zahlen, Zeichenketten, White-Space
program = block"."
block = { "VAR" identlist ":" ident [string] ";"
| "PROCEDURE" ident ["( "[identlist]
[";" "VAR" identlist] ")"]
[":" ident]";" block ident ";"
}
statement
statement = [ident ":=" listexpr |
ident [ "(" [actualparms] ")" ] |
"RETURN" [ "(" [ expression ] ")" ]
"BEGIN" statementseq "END" |
"IF" condition "THEN" statementseq
["ELSE" statementseq] "END" |
"WHILE" condition "DO" statementseq "END" |
"REPEAT" statementseq "UNTIL" condition ]
listexpr = "{" expression {"," expression} "}" | expression
identlist = ident {"," ident}
actualparms = listexpr {"," listexpr}
statementseq = statement {";" statement}
condition = "NOT" condition |
"(" condition ")" ("AND"|"OR") "(" condition ")"
expression ("="|"#"|"<"|"<="|">"|">=") expression
expression = ["+"|"-"] term {("+"|"-") term}
term = power {("*"|"/"|"%") power}
power = factor [ ("^"|"**") number ]
factor = ident ["("[actualparms]")"] |
number | string [ ":" typeexpr ] |
"(" expression ")"
string = ('"' {character} '"' | "'" {character} "'")
ident = letter {letter|digit}
number = digit {digit}
statement = [ ident ":=" expression |
"WHILE" condition "DO" statements "END" ]
Beschreibung der Speicherveränderungen und des
Ein-/Ausgabeverhaltens eines Programmes.
Variablen bezeichnen Speicheradressen.
| syntaktische Einheit | semantische Einheit |
| ident | I |
| condition | B |
| expression | T |
| statement | C |
| statements | {C} = C;...;C |
1234 ist 1234
12+3*4 bedeutet 24
I:=T
Der Speicher wird so verändert, dass der Wert von
T in einem Speicherplatz mit der
symbolischen Adresse I abgelegt wird.
WHILE B DO C END
Falls der Wert des booleschen Ausdrucks B
wahr ergibt, so wird die Anweisung C
und anschliessend noch einmal die gesammte Anweisung
WHILE B DO C END ausgeführt.
Falls der Wert des booleschen Ausdrucks B
falsch ergibt, so bleibt der Speicher
unverändert und die Ausführung der gesammten Anweisung
WHILE B DO C END wird beendet.
Beschreibung von Zustandsänderungen einer abstrakten Maschine.
zum Beispiel: Prozessor Definition, Java Virtual Machine, P-code Machine
für die Kombination (Programm, Eingabe)
mit den folgenden Bezeichnungen:
Sp[n/I] bezeichnet den Speicher Sp, der an der Stelle I den Wert n hat
Sp[n/I](x) = n falls x die Stelle I bezeichnet, Sp(x) sonst
z1 --> z2 bezeichnet F(z1) = z2
wobei m der Wert von n1 op n2 ist
zum Beispiel: F ( 3.4.St, Sp, +.P, E, A ) = ( 12.St, Sp, P, E, A )
wobei n der Wert von T ist
F ( n.St, Sp, assign(I).P, E, A ) = ( St, Sp[n/I], P, E, A )
zum Beispiel:
( St, Sp, x:=3.P, E, A )
--> ( 3.St, Sp, assign(x).P, E, A )
--> ( St, Sp[3/x], P, E, A )
F ( true.St, Sp, while(B,C).P, E, A ) = ( St, Sp, C.WHILE B DO C END.P, E, A )
F ( false.St, Sp, while(B,C).P, E, A ) = ( St, Sp, P, E, A )
zum Beispiel:
( St, Sp[0/x], WHILE x<1 DO x:=x+1 END.P, E, A )
--> ( true.St, Sp[0/x], while(x<1,x:=x+1).P, E, A )
--> ( St, Sp[0/x], x:=x+1.WHILE x<1 DO x:=x+1 END.P, E, A )
--> ( St, Sp[1/x], WHILE x<1 DO x:=x+1 END.P, E, A )
--> ( false.St, Sp[1/x], while(x<1,x:=x+1).P, E, A )
--> ( St, Sp[1/x], P, E, A )
Semantik Funktionen:
Notation: T[[ T ]] z = ( n, z' )
Notation: C[[ P ]] z = z'
T[[ T1 ]] z = ( n1, z1 ) und T[[ T2 ]] z1 = ( n2, z2 )
T[[ T ]] z = ( n, ( Sp, e', a ) )
| C[[ C; WHILE B DO C END ]] z' | falls T[[ B ]] z = ( true, z' ) |
| z' |
falls T[[ B ]] z = ( false, z' ) |
Prädikate beschreiben die Bedeutung.
Prädikatenlogik erster StufeAxiomenschema: { Q } C { R }
Q ist die Vorbedingung (Precondition) R ist die Nachbedingung (Postcondition).Falls Q für einen Zustand z erfüllt ist und C im Zustand z mit z' terminiert, dann gilt R im Zustand z'.
| { Q } C1 { R }, { R } C2 { S } |
| ------------------------------------ |
| { Q } C1; C2 { S } |
| { Q and b } C { Q } |
| --------------------------------------------------- |
| { Q } WHILE B DO C END { Q and not b } |
Beispiel
| { x < 1 } x:=x+1 { } |
| --------------------------------------------------- |
| { } WHILE x < 1 B x:=x+1 END { x >= 1 } |
| Q --> Q1, { Q1 } C { R1 }, R1 --> R |
| ----------------------------------------- |
| { Q } C { R } |