diff --git a/ast.rkt b/ast.rkt index a0b4aa0..dcb2020 100644 --- a/ast.rkt +++ b/ast.rkt @@ -1,5 +1,4 @@ #lang typed/racket - (define-type ConId Integer) (define-type Arity Integer) (define-type Let (∪ 'let 'letrec)) @@ -17,3 +16,13 @@ (List Let (Pair (Bind A) (Listof (Bind A))) (Expr A)) (List 'case (Expr A) (Pair (Alt A) (Listof (Alt A)))) (List 'λ (Pair Name (Listof Name)) (Expr A)))) + +(define-type (ScDefn A) (List 'define (Pair Name (Listof A)) (Expr A))) +(define-type (Program A) (Pair (ScDefn A) (Listof (ScDefn A)))) +(define-type CoreExpr (Expr Name)) +(define-type CoreScDefn (ScDefn Name)) +(define-type CoreProgram (Program Name)) +(define-type CoreBind (Bind Name)) +(define-type CoreAlt (Alt Name)) + +(provide CoreExpr CoreScDefn CoreProgram CoreBind CoreAlt Expr Bind Alt Name Let Arity ConId) diff --git a/main.rkt b/parser.rkt similarity index 82% rename from main.rkt rename to parser.rkt index d32ab50..9cccd92 100644 --- a/main.rkt +++ b/parser.rkt @@ -61,16 +61,16 @@ [program [(sc) (list $1)] [(program SEMICOLON sc) (cons $3 $1)]] [sc [(VAR vars ASSN expr) (list 'define (cons $1 (reverse $2)) $4)]] - [expr [(expr ADD expr) (list '+ $1 $3)] - [(expr MINUS expr) (list '- $1 $3)] + [expr [(expr ADD expr) (list (list '+ $1) $3)] + [(expr MINUS expr) (list (list '- $1) $3)] [(LET defns IN expr) (list $1 (reverse $2) $4)] - [(expr MULT expr) (list '* $1 $3)] - [(expr OR expr) (list 'or $1 $3)] - [(expr AND expr) (list 'and $1 $3)] - [(expr RELOP expr) (list $2 $1 $3)] - [(expr LBRAK expr) (list '< $1 $3)] - [(expr RBRAK expr) (list '> $1 $3)] - [(expr DIV expr) (list '/ $1 $3)] + [(expr MULT expr) (list (list '* $1) $3)] + [(expr OR expr) (list (list 'or $1) $3)] + [(expr AND expr) (list (list 'and $1) $3)] + [(expr RELOP expr) (list (list $2 $1) $3)] + [(expr LBRAK expr) (list (list '< $1) $3)] + [(expr RBRAK expr) (list (list '> $1) $3)] + [(expr DIV expr) (list (list '/ $1) $3)] [(LAM vars1 DOT expr) (list 'λ (reverse $2) $4)] [(CASE expr OF alts) (list 'case $2 (reverse $4))] [(expr0) $1]] @@ -91,7 +91,9 @@ [(alts SEMICOLON alt) (cons $3 $1)]]])) (define (parse-from-port p) - (core/parser (λ () (core/lexer p)))) + (reverse (core/parser (λ () (core/lexer p))))) (define (parse-from-string s) (parse-from-port (open-input-string s))) + +(provide parse-from-port parse-from-string) diff --git a/typed-parser.rkt b/typed-parser.rkt new file mode 100644 index 0000000..dfc67b3 --- /dev/null +++ b/typed-parser.rkt @@ -0,0 +1,7 @@ +#lang typed/racket +(require "ast.rkt") +(require/typed "parser.rkt" + [parse-from-port (-> Input-Port CoreProgram)] + [parse-from-string (-> String CoreProgram)]) + +(provide parse-from-port parse-from-string)