Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Lehre / SS 2011 / Programmierung und Modellierung / Parser fuer vereinfachte Typausdruecke


Inhaltsbereich

Parser fuer vereinfachte Typausdruecke

OCaml source code icon typen.ml — OCaml source code, 1 KB (1811 bytes)

Dateiinhalt

(* 
Abstrakte Syntax: 
  typ ::= int | typ -> typ
 
Lexikalische Syntax: 
  ARR ::= "->"    INT ::= "int"      LPAR ::= "("      RPAR ::= ")"

Phrasale Syntax + Grammatik fuer rek.Abst. umgeschrieben: 
  typ ::= atyp [ ARR typ ]
 atyp ::= INT | LPAR typ RPAR
*)


datatype token = INT | ARR | LPAR | RPAR
exception error of string;
fun lex nil= nil
   |   lex (#" " :: cr) = lex cr
   |   lex (#"\t" :: cr) = lex cr
   |   lex (#"\n" :: cr) = lex cr
   |   lex (#"(" :: cr) = LPAR :: lex cr
   |   lex (#")" :: cr) = RPAR :: lex cr
   |   lex (#"-" :: #">" :: cr) = ARR :: lex cr
   |   lex (#"i" :: #"n" :: #"t" :: cr) = INT :: lex cr
   |   lex _ = raise error "lex";

datatype typ = Int  | Arr of typ * typ 

fun 
      parsetyp text = let val (tree,rest) = parseatyp text in 
                          case rest of 
                               ARR :: rest1 => let val (tree2,rest2) = 
                                            parsetyp rest1 in
                                       (Arr(tree,tree2), rest2) end
                             | _ => (tree,rest)
                      end
and parseatyp text  = case text of 
                             ARR :: rest => raise (error "misplaced ->")
    |                        INT :: rest => (Int, rest)
    |                        LPAR :: rest => let val (tree, rest1) = 
                                                          parsetyp rest in 
                                               case rest1 of 
                                                 RPAR :: rest2 => 
                                                       (tree, rest2)
                                                   | _ => raise (error "missing )")
                                             end
   |                         RPAR  ::rest => raise (error "misplaced )")

Artikelaktionen


Funktionsleiste