1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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-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-input : /"input" b-id @b-id : ID b-expr : b-sum b-sum : b-number (/"+" b-number)* @b-number : INTEGER | DECIMAL | b-id |
1 | 1 + 2 - 3 + 4 - 5 + 6 |
1 | 1 + 2 * 3 + 4 * 5 + 6 |
1 | 1 + (2 * 3) + (4 * 5) + 6 |
1 | (1 + 2) * (3 + 4) * (5 + 6) |
1 2 3 4 | #lang brag program : sum sum : var (/"+" var)* @var : "a" | "b" | "c" | "d" |
1 2 | (require "grammar.rkt") (parse-to-datum "a+b+c+d") |
1 2 3 4 | #lang brag program : sum sum : var [/"+" sum] @var : "a" | "b" | "c" | "d" |
1 2 3 4 | #lang brag program : sum sum : [sum /"+"] var @var : "a" | "b" | "c" | "d" |
1 2 3 4 | #lang brag program : op* op : [op ("+" | "*")] var @var : "a" | "b" | "c" |
1 2 | (require "grammar.rkt") (parse-to-datum "a+b*c") |
1 2 3 4 5 | #lang brag program : sum* sum : [sum "+"] mult mult : [mult "*"] var @var : "a" | "b" | "c" |
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 brag/support) (define-lex-abbrev digits (:+ (char-set "0123456789"))) (define-lex-abbrev reserved-terms (:or "print" "goto" "end" "+" ":" ";" "let" "=" "input" "-" "*" "/" "^" "mod" "(" ")")) (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 | #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-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-input : /"input" b-id @b-id : ID b-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 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #lang br (provide b-expr b-sum b-product b-neg b-expt) (define (b-expr expr) (if (integer? expr) (inexact->exact expr) expr)) (define-macro-cases b-sum [(_ VAL) #'VAL] [(_ LEFT "+" RIGHT) #'(+ LEFT RIGHT)] [(_ LEFT "-" RIGHT) #'(- LEFT RIGHT)]) (define-macro-cases b-product [(_ VAL) #'VAL] [(_ LEFT "*" RIGHT) #'(* LEFT RIGHT)] [(_ LEFT "/" RIGHT) #'(/ LEFT RIGHT 1.0)] [(_ LEFT "mod" RIGHT) #'(modulo LEFT RIGHT)]) (define-macro-cases b-neg [(_ VAL) #'VAL] [(_ "-" VAL) #'(- VAL)]) (define-macro-cases b-expt [(_ VAL) #'VAL] [(_ LEFT "^" RIGHT) #'(expt 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 (provide b-expr b-sum b-product b-neg b-expt) (define (b-expr expr) (if (integer? expr) (inexact->exact expr) expr)) (define-cases b-sum [(_ arg) arg] [(_ left op right) ((case op [("+") +] [("-") -]) left right)]) (define-cases b-product [(_ arg) arg] [(_ left op right) ((case op [("*") *] [("/") (λ (l r) (/ l r 1.0))] [("mod") modulo]) left right)]) (define-cases b-neg [(_ val) val] [(_ _ val) (- val)]) (define-cases b-expt [(_ val) val] [(_ left _ right) (expt left right)]) |