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 #lang typed/racket
(define-type ConId Integer) (define-type ConId Integer)
(define-type Arity Integer) (define-type Arity Integer)
(define-type Let ( 'let 'letrec)) (define-type Let ( 'let 'letrec))
@ -17,3 +16,13 @@
(List Let (Pair (Bind A) (Listof (Bind A))) (Expr A)) (List Let (Pair (Bind A) (Listof (Bind A))) (Expr A))
(List 'case (Expr A) (Pair (Alt A) (Listof (Alt A)))) (List 'case (Expr A) (Pair (Alt A) (Listof (Alt A))))
(List 'λ (Pair Name (Listof Name)) (Expr 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 [(sc) (list $1)]
[(program SEMICOLON sc) (cons $3 $1)]] [(program SEMICOLON sc) (cons $3 $1)]]
[sc [(VAR vars ASSN expr) (list 'define (cons $1 (reverse $2)) $4)]] [sc [(VAR vars ASSN expr) (list 'define (cons $1 (reverse $2)) $4)]]
[expr [(expr ADD expr) (list '+ $1 $3)] [expr [(expr ADD expr) (list (list '+ $1) $3)]
[(expr MINUS expr) (list '- $1 $3)] [(expr MINUS expr) (list (list '- $1) $3)]
[(LET defns IN expr) (list $1 (reverse $2) $4)] [(LET defns IN expr) (list $1 (reverse $2) $4)]
[(expr MULT expr) (list '* $1 $3)] [(expr MULT expr) (list (list '* $1) $3)]
[(expr OR expr) (list 'or $1 $3)] [(expr OR expr) (list (list 'or $1) $3)]
[(expr AND expr) (list 'and $1 $3)] [(expr AND expr) (list (list 'and $1) $3)]
[(expr RELOP expr) (list $2 $1 $3)] [(expr RELOP expr) (list (list $2 $1) $3)]
[(expr LBRAK expr) (list '< $1 $3)] [(expr LBRAK expr) (list (list '< $1) $3)]
[(expr RBRAK expr) (list '> $1 $3)] [(expr RBRAK expr) (list (list '> $1) $3)]
[(expr DIV expr) (list '/ $1 $3)] [(expr DIV expr) (list (list '/ $1) $3)]
[(LAM vars1 DOT expr) (list 'λ (reverse $2) $4)] [(LAM vars1 DOT expr) (list 'λ (reverse $2) $4)]
[(CASE expr OF alts) (list 'case $2 (reverse $4))] [(CASE expr OF alts) (list 'case $2 (reverse $4))]
[(expr0) $1]] [(expr0) $1]]
@ -91,7 +91,9 @@
[(alts SEMICOLON alt) (cons $3 $1)]]])) [(alts SEMICOLON alt) (cons $3 $1)]]]))
(define (parse-from-port p) (define (parse-from-port p)
(core/parser (λ () (core/lexer p)))) (reverse (core/parser (λ () (core/lexer p)))))
(define (parse-from-string s) (define (parse-from-string s)
(parse-from-port (open-input-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)