Thank you for your comment

Beau­tiful Racket / tuto­rials

basic/parser.rkt
#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
 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
copy to clipboard
grammar.rkt
#lang brag
program : sum
sum : var (/"+" var)*
@var : "a" | "b" | "c" | "d"
1
2
3
4
#lang brag
program : sum
sum : var (/"+" var)*
@var : "a" | "b" | "c" | "d"
copy to clipboard
test.rkt
(require "grammar.rkt")
(parse-to-datum "a+b+c+d")
1
2
(require "grammar.rkt")
(parse-to-datum "a+b+c+d")
copy to clipboard
grammar.rkt
#lang brag
program : sum
sum : var [/"+" sum]
@var : "a" | "b" | "c" | "d"
1
2
3
4
#lang brag
program : sum
sum : var [/"+" sum]
@var : "a" | "b" | "c" | "d"
copy to clipboard
grammar.rkt
#lang brag
program : sum
sum : [sum /"+"] var
@var : "a" | "b" | "c" | "d"
1
2
3
4
#lang brag
program : sum
sum : [sum /"+"] var
@var : "a" | "b" | "c" | "d"
copy to clipboard
grammar.rkt
#lang brag
program : op*
op : [op ("+" | "*")] var
@var : "a" | "b" | "c"
1
2
3
4
#lang brag
program : op*
op : [op ("+" | "*")] var
@var : "a" | "b" | "c"
copy to clipboard
test.rkt
(require "grammar.rkt")
(parse-to-datum "a+b*c")
1
2
(require "grammar.rkt")
(parse-to-datum "a+b*c")
copy to clipboard
grammar.rkt
#lang brag
program : sum*
sum : [sum "+"] mult
mult : [mult "*"] var
@var : "a" | "b" | "c"
1
2
3
4
5
#lang brag
program : sum*
sum : [sum "+"] mult
mult : [mult "*"] var
@var : "a" | "b" | "c"
copy to clipboard
basic/lexer.rkt
#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
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)
copy to clipboard
basic/parser.rkt
#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
#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
copy to clipboard
basic/expr.rkt
#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
#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)])
copy to clipboard
basic/expr.rkt
#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)])
 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)])
copy to clipboard
← prev next →