commit 7fe75654d9039e79794cd6b3d5ce4b2694e27337 Author: Yiyun Liu Date: Fri May 23 01:47:01 2025 -0400 Add lexer and parser diff --git a/main.rkt b/main.rkt new file mode 100644 index 0000000..e66c8ea --- /dev/null +++ b/main.rkt @@ -0,0 +1,79 @@ +#lang racket +(require parser-tools/lex) +(require parser-tools/yacc) +(require parser-tools/lex-sre) + +(define-empty-tokens core/empty-tokens + (CASE OF IN LAM PACK ASSN ARROW LPAREN RPAREN LBRAC RBRAC LBRAK + RBRAK SEMICOLON EOF MULT DIV ADD MINUS AND OR COMMA DOT)) + +(define-tokens core/tokens + (NUM VAR RELOP LET)) + +(define core/lexer + (lexer + [(eof) (token-EOF)] + ["." (token-DOT)] + ["," (token-COMMA)] + ["let" (token-LET 'let)] + ["letrec" (token-LET 'letrec)] + ["case" (token-CASE)] + ["of" (token-OF)] + ["in" (token-IN)] + ["\\" (token-LAM)] + ["Pack" (token-PACK)] + ["=" (token-ASSN)] + ["->" (token-ARROW)] + ["+" (token-ADD)] + ["-" (token-MINUS)] + ["*" (token-MULT)] + ["/" (token-DIV)] + ["&" (token-AND)] + ["|" (token-OR)] + [(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))] + [blank (core/lexer input-port)])) + +(define core/parser + (parser + [start expr] + [end EOF] + [tokens core/empty-tokens core/tokens] + [precs + (nonassoc IN DOT) + (right OR) + (right AND) + (right RELOP) + (left ADD MINUS) + (left MULT DIV)] + [error void] + [grammar + [expr [(expr ADD expr) (list '+ $1 $3)] + [(expr MINUS expr) (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 DIV expr) (list '/ $1 $3)] + [(LAM vars DOT expr) (list 'λ (reverse $2) $4)] + [(expr0) $1]] + [expr0 [(expr0 aexpr) (list $1 $2)] + [(aexpr) $1]] + [aexpr [(NUM) $1] + [(VAR) $1] + [(LPAREN expr RPAREN) $2] + [(PACK LBRAC NUM COMMA NUM RBRAC) (list 'pack $3 $5)]] + [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)]]]))