Add FFI to untyped parser
This commit is contained in:
parent
1507c6c40f
commit
bb0e9f68a8
3 changed files with 29 additions and 11 deletions
11
ast.rkt
11
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)
|
||||
|
|
|
@ -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)
|
7
typed-parser.rkt
Normal file
7
typed-parser.rkt
Normal file
|
@ -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)
|
Loading…
Add table
Add a link
Reference in a new issue