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 } |