Skip to content

Instantly share code, notes, and snippets.

@strcrzy
Forked from danking/gist:1068185
Created November 13, 2011 21:03
Show Gist options
  • Save strcrzy/1362706 to your computer and use it in GitHub Desktop.
Save strcrzy/1362706 to your computer and use it in GitHub Desktop.
A very simple example showing how to use Racket's lexing and parsing utilities
#lang racket
(require parser-tools/lex
(prefix-in re- parser-tools/lex-sre)
parser-tools/yacc)
(provide (all-defined-out))
(define-tokens a (NUM))
(define-empty-tokens b (+ - EOF))
(define-lex-trans number
(syntax-rules ()
((_ digit)
(re-: (re-? (re-or "-" "+")) (uinteger digit)
(re-? (re-: "." (re-? (uinteger digit))))))))
(define-lex-trans uinteger
(syntax-rules ()
((_ digit) (re-+ digit))))
(define-lex-abbrevs
(digit10 (char-range "0" "9"))
(number10 (number digit10)))
(define simple-math-lexer
(lexer
((re-+ number10) (token-NUM (string->number lexeme)))
("-" (token--))
("+" (token-+))
;; recursively calls the lexer which effectively skips whitespace
(whitespace (simple-math-lexer input-port))
((eof) (token-EOF))))
(define simple-math-parser
(parser
(start exp)
(end EOF)
(error void)
(tokens a b)
(precs (left - +))
(grammar
(exp ((NUM) $1)
((exp + exp) (+ $1 $3))
((exp - exp) (- $1 $3))))))
(define (lex-this lexer input) (lambda () (lexer input)))
(let ((input (open-input-string "3 - 3.3 + 6")))
(simple-math-parser (lex-this simple-math-lexer input)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment