From 7776723a77d375f4440e0f3e1ffc1e4b54472404 Mon Sep 17 00:00:00 2001 From: Yiyun Liu Date: Sat, 24 May 2025 02:04:37 -0400 Subject: [PATCH] Finish the parser --- main.rkt | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/main.rkt b/main.rkt index e66c8ea..d32ab50 100644 --- a/main.rkt +++ b/main.rkt @@ -30,13 +30,13 @@ ["/" (token-DIV)] ["&" (token-AND)] ["|" (token-OR)] - [(or "<" "<=" "==" "~=" ">=" ">") (token-RELOP (string->symbol lexeme))] + ["<" (token-LBRAK)] + [">" (token-RBRAK)] + [(or "<=" "==" "~=" ">=") (token-RELOP (string->symbol lexeme))] ["(" (token-LPAREN)] [")" (token-RPAREN)] ["{" (token-LBRAC)] ["}" (token-RBRAC)] - ["<" (token-LBRAK)] - [">" (token-RBRAK)] [";" (token-SEMICOLON)] [(+ numeric) (token-NUM (string->number lexeme))] [(: alphabetic (* (or alphabetic numeric #\_))) (token-VAR (string->symbol lexeme))] @@ -44,18 +44,23 @@ (define core/parser (parser - [start expr] + [start program] [end EOF] [tokens core/empty-tokens core/tokens] [precs - (nonassoc IN DOT) + (nonassoc IN DOT OF ARROW) + (nonassoc SEMICOLON) (right OR) (right AND) - (right RELOP) + (right RELOP LBRAK RBRAK) (left ADD MINUS) (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 + [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)] [(LET defns IN expr) (list $1 (reverse $2) $4)] @@ -63,8 +68,11 @@ [(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)] - [(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 [(expr0 aexpr) (list $1 $2)] [(aexpr) $1]] @@ -75,5 +83,15 @@ [defns [(defns SEMICOLON defn) (cons $3 $1)] [(defn) (list $1)]] [defn [(VAR ASSN expr) (list $1 $3)]] - [vars [(VAR) (list $1)] - [(vars VAR) (cons $2 $1)]]])) + [vars [() (list)] + [(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)))