Finish the parser
This commit is contained in:
parent
7fe75654d9
commit
7776723a77
1 changed files with 28 additions and 10 deletions
38
main.rkt
38
main.rkt
|
@ -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)))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue