1 2 3 4 5 6 | #lang basic-demo-2 10 x = 3 20 if x > 0 then print x else 5 * 10 30 x = x - 1 40 goto 20 50 print "done" |
1 2 3 4 | 3 2 1 done |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #lang br (require brag/support) (define-lex-abbrev digits (:+ (char-set "0123456789"))) (define-lex-abbrev reserved-terms (:or "print" "goto" "end" "+" ":" ";" "let" "=" "input" "-" "*" "/" "^" "mod" "(" ")" "if" "then" "else" "<" ">" "<>" "and" "or" "not")) (define basic-lexer (lexer-srcloc ["\n" (token 'NEWLINE lexeme)] [whitespace (token lexeme #:skip? #t)] [(from/stop-before "rem" "\n") (token 'REM lexeme)] [reserved-terms (token lexeme lexeme)] [(:seq alphabetic (:* (:or alphabetic numeric "$"))) (token 'ID (string->symbol lexeme))] [digits (token 'INTEGER (string->number lexeme))] [(:or (:seq (:? digits) "." digits) (:seq digits ".")) (token 'DECIMAL (string->number lexeme))] [(:or (from/to "\"" "\"") (from/to "'" "'")) (token 'STRING (substring lexeme 1 (sub1 (string-length lexeme))))])) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #lang brag b-program : [b-line] (/NEWLINE [b-line])* b-line : b-line-num [b-statement] (/":" [b-statement])* [b-rem] @b-line-num : INTEGER @b-statement : b-end | b-print | b-goto | b-let | b-input | b-if b-rem : REM b-end : /"end" b-print : /"print" [b-printable] (/";" [b-printable])* @b-printable : STRING | b-expr b-goto : /"goto" b-expr b-let : [/"let"] b-id /"=" (b-expr | STRING) b-if : /"if" b-expr /"then" (b-statement | b-expr) [/"else" (b-statement | b-expr)] b-input : /"input" b-id @b-id : ID b-expr : b-or-expr b-or-expr : [b-or-expr "or"] b-and-expr b-and-expr : [b-and-expr "and"] b-not-expr b-not-expr : ["not"] b-comp-expr b-comp-expr : [b-comp-expr ("="|"<"|">"|"<>")] b-sum b-sum : [b-sum ("+"|"-")] b-product b-product : [b-product ("*"|"/"|"mod")] b-neg b-neg : ["-"] b-expt b-expt : [b-expt ("^")] b-value @b-value : b-number | b-id | /"(" b-expr /")" @b-number : INTEGER | DECIMAL |
1 2 3 4 5 6 | #lang br (require "line.rkt" "go.rkt" "expr.rkt" "misc.rkt" "cond.rkt") (provide (all-from-out "line.rkt" "go.rkt" "expr.rkt" "misc.rkt" "cond.rkt")) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #lang br (require "go.rkt") (provide b-if b-or-expr b-and-expr b-not-expr b-comp-expr) (define (bool->int val) (if val 1 0)) (define nonzero? (compose1 not zero?)) (define-macro-cases b-or-expr [(_ VAL) #'VAL] [(_ LEFT "or" RIGHT) #'(bool->int (or (nonzero? LEFT) (nonzero? RIGHT)))]) (define-macro-cases b-and-expr [(_ VAL) #'VAL] [(_ LEFT "and" RIGHT) #'(bool->int (and (nonzero? LEFT) (nonzero? RIGHT)))]) (define-macro-cases b-not-expr [(_ VAL) #'VAL] [(_ "not" VAL) #'(if (nonzero? VAL) 0 1)]) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #lang br (require "go.rkt") (provide b-if b-or-expr b-and-expr b-not-expr b-comp-expr) (define (bool->int val) (if val 1 0)) (define nonzero? (compose1 not zero?)) (define-macro-cases b-or-expr ···) (define-macro-cases b-and-expr ···) (define-macro-cases b-not-expr ···) (define b= (compose1 bool->int =)) (define b< (compose1 bool->int <)) (define b> (compose1 bool->int >)) (define b<> (compose1 bool->int not =)) (define-macro-cases b-comp-expr [(_ VAL) #'VAL] [(_ LEFT "=" RIGHT) #'(b= LEFT RIGHT)] [(_ LEFT "<" RIGHT) #'(b< LEFT RIGHT)] [(_ LEFT ">" RIGHT) #'(b> LEFT RIGHT)] [(_ LEFT "<>" RIGHT) #'(b<> LEFT RIGHT)]) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #lang br (require "go.rkt") (provide b-if b-or-expr b-and-expr b-not-expr b-comp-expr) (define (bool->int val) (if val 1 0)) (define nonzero? (compose1 not zero?)) (define-macro-cases b-or-expr ···) (define-macro-cases b-and-expr ···) (define-macro-cases b-not-expr ···) (define b= ···) (define b< ···) (define b> ···) (define b<> ···) (define-macro-cases b-comp-expr ···) (define-macro-cases b-if [(_ COND-EXPR THEN-EXPR) #'(b-if COND-EXPR THEN-EXPR (void))] [(_ COND-EXPR THEN-EXPR ELSE-EXPR) #'(let ([result (if (nonzero? COND-EXPR) THEN-EXPR ELSE-EXPR)]) (when (exact-positive-integer? result) (b-goto result)))]) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #lang br (require "go.rkt") (provide b-if b-or-expr b-and-expr b-not-expr b-comp-expr) (define (bool->int val) (if val 1 0)) (define nonzero? (compose1 not zero?)) (define-macro-cases b-or-expr [(_ VAL) #'VAL] [(_ LEFT "or" RIGHT) #'(bool->int (or (nonzero? LEFT) (nonzero? RIGHT)))]) (define-macro-cases b-and-expr [(_ VAL) #'VAL] [(_ LEFT "and" RIGHT) #'(bool->int (and (nonzero? LEFT) (nonzero? RIGHT)))]) (define-macro-cases b-not-expr [(_ VAL) #'VAL] [(_ "not" VAL) #'(if (nonzero? VAL) 0 1)]) (define b= (compose1 bool->int =)) (define b< (compose1 bool->int <)) (define b> (compose1 bool->int >)) (define b<> (compose1 bool->int not =)) (define-macro-cases b-comp-expr [(_ VAL) #'VAL] [(_ LEFT "=" RIGHT) #'(b= LEFT RIGHT)] [(_ LEFT "<" RIGHT) #'(b< LEFT RIGHT)] [(_ LEFT ">" RIGHT) #'(b> LEFT RIGHT)] [(_ LEFT "<>" RIGHT) #'(b<> LEFT RIGHT)]) (define-macro-cases b-if [(_ COND-EXPR THEN-EXPR) #'(b-if COND-EXPR THEN-EXPR (void))] [(_ COND-EXPR THEN-EXPR ELSE-EXPR) #'(let ([result (if (nonzero? COND-EXPR) THEN-EXPR ELSE-EXPR)]) (when (exact-positive-integer? result) (b-goto result)))]) |