Benutzer:Grey/pss: Unterschied zwischen den Versionen
(→BNF) |
(→BNF) |
||
| Zeile 15: | Zeile 15: | ||
Erste Umformung inklusive semantischer Aktionen: | Erste Umformung inklusive semantischer Aktionen: | ||
| − | 1)Prog -> Def | + | 1)Prog -> Def '''<1>''' Def´ #<br> |
| − | 2)Def -> <u>DEF</u> Lhs <u>==</u> Expr | + | 2)Def -> <u>DEF</u> Lhs <u>==</u> Expr '''<2>'''<br> |
| − | 3)Def' -> Def | + | 3)Def' -> Def '''<3>''' Def´ |
4) | e<br> | 4) | e<br> | ||
| − | 5)Lhs -> <u>MAIN</u> <u>:</u> Type | + | 5)Lhs -> <u>MAIN</u> '''<5>''' <u>:</u> Type '''<4>''' |
| − | 6) | <u>id</u> <u>(</u> | + | 6) | <u>id</u> <u>(</u> '''<5>''' Lhs´ <u>)</u> <u>:</u> Type '''<4>'''<br> |
| − | 7) | + | 7)Lhs´ -> <u>id</u> <u>:</u> Type '''<6>''' Lhs´´ |
8) | e<br> | 8) | e<br> | ||
| − | 9)Lhs´´ -> <u>,</u> | + | 9)Lhs´´ -> <u>,</u> Lhs´ |
10) | e<br> | 10) | e<br> | ||
11)Type -> <u>nat</u> | 11)Type -> <u>nat</u> | ||
12) | <u>bool</u><br> | 12) | <u>bool</u><br> | ||
| − | 13)Expr -> <u>number</u> | + | 13)Expr -> <u>number</u> '''<7>''' |
| − | 14) | <u>true</u> | + | 14) | <u>true</u> '''<8>''' |
| − | 15) | <u>false</u> | + | 15) | <u>false</u> '''<8>''' |
| − | 16) | <u>id</u> | + | 16) | <u>id</u> Expr´ |
| − | 17) | <u>IF</u> Expr <u>THEN</u> Expr | + | 17) | <u>IF</u> Expr <u>THEN</u> Expr fi´ <br> |
| − | 18) | + | 18)Expr´ -> <u>(</u> '''<10>''' Expr´´ <u>)</u> '''<9>''' |
| − | 19) | e<br> | + | 19) | e '''<12>'''<br> |
| − | 20)Expr´´ -> Expr Expr´´´ | + | 20)Expr´´ -> Expr '''<11>''' Expr´´´ |
21) | e<br> | 21) | e<br> | ||
| − | 22)Expr´´´ -> <u>,</u> Expr Expr´´´ | + | 22)Expr´´´ -> <u>,</u> Expr '''<11>''' Expr´´´ |
23) | e<br> | 23) | e<br> | ||
| − | 24) | + | 24)fi´ -> <u>ELSE</u> Expr FI '''<14>''' |
| − | | | + | | FI '''<13>''' <br> |
| + | |||
| + | <u>Semantische Aktionen:</u> | ||
| + | '''<1>''' : makeDefList<br> | ||
| + | '''<2>''' : makeDef<br> | ||
| + | '''<3>''' : add2DefList<br> | ||
| + | '''<4>''' : makeLhs<br> | ||
| + | '''<5>''' : makeLhsParList<br> | ||
| + | '''<6>''' : add2LhsParList<br> | ||
| + | '''<7>''' : makeNatConst<br> | ||
| + | '''<8>''' : makeBoolConst<br> | ||
| + | '''<9>''' : makeFunCall<br> | ||
| + | '''<10>''' : makeExprList<br> | ||
| + | '''<11>''' : add2ExprList<br> | ||
| + | '''<12>''' : makeParRef<br> | ||
| + | '''<13>''' : makeCond<br> | ||
| + | '''<14>''' : makeElse<br> | ||
== Directormengen == | == Directormengen == | ||
Version vom 9. Dezember 2005, 11:49 Uhr
Inhaltsverzeichnis
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´´ -> , Lhs´ 10) | e
11)Type -> nat 12) | bool
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
Directormengen
| Vorlage:Highlight1 |Produktion | Vorlage:Highlight1 |Directormenge | Vorlage:Highlight1 |disjunkt? |
|---|---|---|
| 1) | uninteressant | ja |
| 2) | uninteressant | ja |
| 3) 3b) |
{DEF} {#, DEF} |
ja |
| 4) 5) |
{MAIN} {id} |
ja |
| 6) 7) |
{id} {)} |
ja |
| 8) 9) |
{,} {)} |
ja |
| 10) 11) |
{nat} {bool} |
ja |
| 12) 13) 14) 15) 16) |
{number} {true} {false} {id} {IF} |
ja |
| 17) 18) |
{(} {THEN, ELSE, FI, ,, )} |
ja |
| 19) 20) |
{number, true, false, id, IF} {,, )} |
ja |
| 21) 22) |
{,} {)} |
ja |
| 23) 24) |
{ELSE} {FI} |
ja |
Abstrakter Syntaxbaum
http://www.freitagsrunde.org/~grey/pss/absy.jpg
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