Add lexer and parser
This commit is contained in:
commit
7fe75654d9
1 changed files with 79 additions and 0 deletions
79
main.rkt
Normal file
79
main.rkt
Normal file
|
@ -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)]]]))
|
Loading…
Add table
Add a link
Reference in a new issue