Add FFI to untyped parser

This commit is contained in:
Yiyun Liu 2025-05-24 14:03:50 -04:00
parent 1507c6c40f
commit bb0e9f68a8
3 changed files with 29 additions and 11 deletions

11
ast.rkt
View file

@ -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)

View file

@ -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
View 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)