Finish the parser

This commit is contained in:
Yiyun Liu 2025-05-24 02:04:37 -04:00
parent 7fe75654d9
commit 7776723a77

View file

@ -30,13 +30,13 @@
["/" (token-DIV)] ["/" (token-DIV)]
["&" (token-AND)] ["&" (token-AND)]
["|" (token-OR)] ["|" (token-OR)]
[(or "<" "<=" "==" "~=" ">=" ">") (token-RELOP (string->symbol lexeme))] ["<" (token-LBRAK)]
[">" (token-RBRAK)]
[(or "<=" "==" "~=" ">=") (token-RELOP (string->symbol lexeme))]
["(" (token-LPAREN)] ["(" (token-LPAREN)]
[")" (token-RPAREN)] [")" (token-RPAREN)]
["{" (token-LBRAC)] ["{" (token-LBRAC)]
["}" (token-RBRAC)] ["}" (token-RBRAC)]
["<" (token-LBRAK)]
[">" (token-RBRAK)]
[";" (token-SEMICOLON)] [";" (token-SEMICOLON)]
[(+ numeric) (token-NUM (string->number lexeme))] [(+ numeric) (token-NUM (string->number lexeme))]
[(: alphabetic (* (or alphabetic numeric #\_))) (token-VAR (string->symbol lexeme))] [(: alphabetic (* (or alphabetic numeric #\_))) (token-VAR (string->symbol lexeme))]
@ -44,18 +44,23 @@
(define core/parser (define core/parser
(parser (parser
[start expr] [start program]
[end EOF] [end EOF]
[tokens core/empty-tokens core/tokens] [tokens core/empty-tokens core/tokens]
[precs [precs
(nonassoc IN DOT) (nonassoc IN DOT OF ARROW)
(nonassoc SEMICOLON)
(right OR) (right OR)
(right AND) (right AND)
(right RELOP) (right RELOP LBRAK RBRAK)
(left ADD MINUS) (left ADD MINUS)
(left MULT DIV)] (left MULT DIV)]
[error void] [error (λ (tok-ok? tok-name tok-value)
(error (format "Token Ok?: ~a\nToken name: ~a\nToken value: ~a" tok-ok? tok-name tok-value)))]
[grammar [grammar
[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 [(expr ADD expr) (list '+ $1 $3)]
[(expr MINUS expr) (list '- $1 $3)] [(expr MINUS expr) (list '- $1 $3)]
[(LET defns IN expr) (list $1 (reverse $2) $4)] [(LET defns IN expr) (list $1 (reverse $2) $4)]
@ -63,8 +68,11 @@
[(expr OR expr) (list 'or $1 $3)] [(expr OR expr) (list 'or $1 $3)]
[(expr AND expr) (list 'and $1 $3)] [(expr AND expr) (list 'and $1 $3)]
[(expr RELOP expr) (list $2 $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 DIV expr) (list '/ $1 $3)]
[(LAM vars DOT expr) (list 'λ (reverse $2) $4)] [(LAM vars1 DOT expr) (list 'λ (reverse $2) $4)]
[(CASE expr OF alts) (list 'case $2 (reverse $4))]
[(expr0) $1]] [(expr0) $1]]
[expr0 [(expr0 aexpr) (list $1 $2)] [expr0 [(expr0 aexpr) (list $1 $2)]
[(aexpr) $1]] [(aexpr) $1]]
@ -75,5 +83,15 @@
[defns [(defns SEMICOLON defn) (cons $3 $1)] [defns [(defns SEMICOLON defn) (cons $3 $1)]
[(defn) (list $1)]] [(defn) (list $1)]]
[defn [(VAR ASSN expr) (list $1 $3)]] [defn [(VAR ASSN expr) (list $1 $3)]]
[vars [(VAR) (list $1)] [vars [() (list)]
[(vars VAR) (cons $2 $1)]]])) [(vars VAR) (cons $2 $1)]]
[vars1 [(vars VAR) (cons $2 $1)]]
[alt [(LBRAK NUM RBRAK vars ARROW expr) (list 'branch $2 (reverse $4) $6)]]
[alts [(alt) (list $1)]
[(alts SEMICOLON alt) (cons $3 $1)]]]))
(define (parse-from-port p)
(core/parser (λ () (core/lexer p))))
(define (parse-from-string s)
(parse-from-port (open-input-string s)))