Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Benutzer:Grey/pss: Unterschied zwischen den Versionen

(BNF)
(Directormengen)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 23: Zeile 23:
 
   7)Lhs´  ->  <u>id</u> <u>:</u> Type  '''<6>''' Lhs´´
 
   7)Lhs´  ->  <u>id</u> <u>:</u> Type  '''<6>''' Lhs´´
 
   8) |  e<br>
 
   8) |  e<br>
   9)Lhs´´ ->  <u>,</u> Lhs´
+
   9)Lhs´´ ->  <u>,</u> <u>id</u> <u>:</u> Type Lhs´´
 
  10) |  e<br>
 
  10) |  e<br>
  11)Type  ->  <u>nat</u>
+
  11)Type  ->  <u>nat</u> '''<15>'''
  12)      |  <u>bool</u><br>
+
  12)      |  <u>bool</u> '''<15>''' <br>
 
  13)Expr    ->  <u>number</u> '''<7>'''
 
  13)Expr    ->  <u>number</u> '''<7>'''
 
  14)      |  <u>true</u> '''<8>'''
 
  14)      |  <u>true</u> '''<8>'''
Zeile 37: Zeile 37:
 
  21)            |  e<br>
 
  21)            |  e<br>
 
  22)Expr´´´ ->  <u>,</u> Expr '''<11>''' Expr´´´
 
  22)Expr´´´ ->  <u>,</u> Expr '''<11>''' Expr´´´
  23) |  e<br>
+
  23)           |  e<br>
 
  24)fi´    ->  <u>ELSE</u> Expr FI '''<14>'''
 
  24)fi´    ->  <u>ELSE</u> Expr FI '''<14>'''
 
       |  FI '''<13>''' <br>
 
       |  FI '''<13>''' <br>
  
<u>Semantische Aktionen:</u>
+
<u>Semantische Aktionen:</u><br>
 
'''<1>''' : makeDefList<br>
 
'''<1>''' : makeDefList<br>
 
'''<2>''' : makeDef<br>
 
'''<2>''' : makeDef<br>
Zeile 56: Zeile 56:
 
'''<13>''' : makeCond<br>
 
'''<13>''' : makeCond<br>
 
'''<14>''' : makeElse<br>
 
'''<14>''' : makeElse<br>
 +
'''<15>''' : makeType<br>
  
 
== Directormengen ==
 
== Directormengen ==
Zeile 71: Zeile 72:
 
|ja
 
|ja
 
|-
 
|-
|3) <br>3b)
+
|3) <br>4)
 
|{<u>DEF</u>} <br>{#, <u>DEF</u>}
 
|{<u>DEF</u>} <br>{#, <u>DEF</u>}
 
|ja
 
|ja
 
|-
 
|-
|4) <br>5)
+
|5) <br>6)
 
|{<u>MAIN</u>} <br>{<u>id</u>}
 
|{<u>MAIN</u>} <br>{<u>id</u>}
 
|ja
 
|ja
 
|-
 
|-
|6) <br>7)
+
|7) <br>8)
 
|{<u>id</u>} <br>{<u>)</u>}
 
|{<u>id</u>} <br>{<u>)</u>}
 
|ja
 
|ja
 
|-
 
|-
|8) <br> 9)
+
|9) <br> 10)
 
|{<u>,</u>} <br>{<u>)</u>}
 
|{<u>,</u>} <br>{<u>)</u>}
 
|ja
 
|ja
 
|-
 
|-
|10) <br> 11)
+
|11) <br> 12)
 
|{<u>nat</u>} <br>{<u>bool</u>}
 
|{<u>nat</u>} <br>{<u>bool</u>}
 
|ja
 
|ja
 
|-
 
|-
|12) <br>13) <br>14) <br>15) <br>16)
+
|13) <br>14) <br>15) <br>16) <br>17)
 
|{<u>number</u>} <br>{<u>true</u>} <br>{<u>false</u>} <br>{<u>id</u>} <br>{<u>IF</u>}
 
|{<u>number</u>} <br>{<u>true</u>} <br>{<u>false</u>} <br>{<u>id</u>} <br>{<u>IF</u>}
 
|ja
 
|ja
 
|-
 
|-
|17) <br>18)
+
|18) <br>19)
 
|{<u>(</u>} <br>{<u>THEN</u>, <u>ELSE</u>, <u>FI</u>, <u>,</u>, <u>)</u>}
 
|{<u>(</u>} <br>{<u>THEN</u>, <u>ELSE</u>, <u>FI</u>, <u>,</u>, <u>)</u>}
 
|ja
 
|ja
 
|-
 
|-
|19) <br>20)
+
|20) <br>21)
 
|{<u>number</u>, <u>true</u>, <u>false</u>, <u>id</u>, <u>IF</u>} <br>{<u>,</u>, <u>)</u>}
 
|{<u>number</u>, <u>true</u>, <u>false</u>, <u>id</u>, <u>IF</u>} <br>{<u>,</u>, <u>)</u>}
 
|ja
 
|ja
 
|-
 
|-
|21) <br>22)
+
|22) <br>23)
 
|{<u>,</u>} <br> {<u>)</u>}
 
|{<u>,</u>} <br> {<u>)</u>}
 
|ja
 
|ja
 
|-
 
|-
|23) <br>24)
+
|24) <br>25)
 
|{<u>ELSE</u>} <br>{<u>FI</u>}
 
|{<u>ELSE</u>} <br>{<u>FI</u>}
 
|ja
 
|ja
 
|}
 
|}
 
 
  
 
== Abstrakter Syntaxbaum ==
 
== Abstrakter Syntaxbaum ==
Zeile 118: Zeile 117:
  
  
 
== Implementation ==
 
=== Absy.impl ===
 
IMPLEMENTATION Absy
 
 
 
DATA absy == Prog( defseq:seq[absy])
 
Def(id:denotation, seq[id:denotation, typ: type], typ:type)
 
Funcall(id: denotation, parref: seq[absy])
 
ParRef(id:denotation)
 
Cond(ifCond:absy, thenCond:absy)
 
CondElse(ifElse:absy, thenElse:absy, elseElse: absy)
 
NatConst(number:nat)
 
BoolConst(boolean:bool)
 
 
DATA type == TNat(n:nat)
 
TBool(b:bool)
 
 
 
-- Ausgabefunktion vom Absy
 
-- DEF `(Absy) == 
 
DEF `(Prog(defseq)) == "Prog(" ++ (printSeqAbsy(defseq)) ++ ")"
 
DEF `(Def(id,seqIdTyp,typ)) == "Def " ++ id ++ "(" ++ (printSeqType(seqIdTyp)) ++ ") :" ++ (printType(typ))
 
DEF `(Funcall(id,parref)) == "Funcall:" ++ id ++ "(" ++ (printSeqAbsy(parref)) ++ ")"
 
DEF `(ParRef(id)) == "ParRef:" ++ id
 
DEF `(Cond(ifCond,thenCond)) == "Cond(" ++ "IF " ++ (`(ifCond)) ++ " THEN " ++ (`(thenCond)) ++ ")"
 
DEF `(CondElse(ifCondE,thenCondE, elseCondE)) == "Cond(" ++ "IF " ++ (`(ifCondE)) ++ " THEN " ++ (`(thenCondE)) ++ " ELSE " ++ (`(elseCondE)) ++ ")"
 
DEF `(NatConst(natC)) == `(natC)
 
DEF `(BoolConst(boolC)) == `(boolC)
 
 
DEF printSeqAbsy(<>) == "<>"
 
DEF printSeqAbsy(a::R) == `(a) ++ ";" ++ printSeqAbsy(R)
 
 
DEF printType(TNat) == "nat"
 
DEF printType(TBool) == "bool"
 
 
DEF printSeqType(<>) == "<>"
 
DEF printSeqType((id,typ)::R) == id ++ ":" ++ printType(typ) ++ ", " ++ printSeqType(R)
 
 
=== Absy.sign ===
 
/* %
 
Die abstrakte Syntax. NOT YET IMPLEMENTED.
 
*/
 
 
 
SIGNATURE Absy
 
 
 
SORT absy
 
 
-- Augabefunktion
 
FUN ` : absy -> denotation
 
 
-- Ausgabefunktionen für Typen inerhalb von Absy
 
FUN printSeqAbsy : seq[absy] -> denotation
 
FUN printType : type -> denotation
 
FUN printSeqType : seq[denotation, type] -> denotation
 
  
  
 
[[Kategorie:GREY-PSS]]
 
[[Kategorie:GREY-PSS]]

Aktuelle Version vom 11. Januar 2006, 20:38 Uhr

Milstone 1

  • EBNF in BNF Grammatik umwandeln:

EBNF

Gegeben ist folgende EBNF Syntax von microOPAL:

Prog -> Def Def * #
Def  -> DEF Lhs == Expr
Lhs  -> MAIN : Type | id ( [id : Type (, id : Type)*]) : Type
Type -> nat | bool
Expr -> number | true | false | id [ ( [Expr (, Expr)*] ) ] | IF Expr THEN Expr [ELSE Expr] FI


BNF

Erste Umformung inklusive semantischer Aktionen:

 1)Prog  	->  Def <1> Def´ #
2)Def -> DEF Lhs == Expr <2>
3)Def' -> Def <3> Def´ 4) | e
5)Lhs -> MAIN <5> : Type <4> 6) | id ( <5> Lhs´ ) : Type <4>
7)Lhs´ -> id : Type <6> Lhs´´ 8) | e
9)Lhs´´ -> , id : Type Lhs´´ 10) | e
11)Type -> nat <15> 12) | bool <15>
13)Expr -> number <7> 14) | true <8> 15) | false <8> 16) | id Expr´ 17) | IF Expr THEN Expr fi´
18)Expr´ -> ( <10> Expr´´ ) <9> 19) | e <12>
20)Expr´´ -> Expr <11> Expr´´´ 21) | e
22)Expr´´´ -> , Expr <11> Expr´´´ 23) | e
24)fi´ -> ELSE Expr FI <14> | FI <13>

Semantische Aktionen:
<1> : makeDefList
<2> : makeDef
<3> : add2DefList
<4> : makeLhs
<5> : makeLhsParList
<6> : add2LhsParList
<7> : makeNatConst
<8> : makeBoolConst
<9> : makeFunCall
<10> : makeExprList
<11> : add2ExprList
<12> : makeParRef
<13> : makeCond
<14> : makeElse
<15> : makeType

Directormengen

Vorlage:Highlight1 |Produktion Vorlage:Highlight1 |Directormenge Vorlage:Highlight1 |disjunkt?
1) uninteressant ja
2) uninteressant ja
3)
4)
{DEF}
{#, DEF}
ja
5)
6)
{MAIN}
{id}
ja
7)
8)
{id}
{)}
ja
9)
10)
{,}
{)}
ja
11)
12)
{nat}
{bool}
ja
13)
14)
15)
16)
17)
{number}
{true}
{false}
{id}
{IF}
ja
18)
19)
{(}
{THEN, ELSE, FI, ,, )}
ja
20)
21)
{number, true, false, id, IF}
{,, )}
ja
22)
23)
{,}
{)}
ja
24)
25)
{ELSE}
{FI}
ja

Abstrakter Syntaxbaum

http://www.freitagsrunde.org/~grey/pss/absy.jpg