1#lang eopl 2 3;; grammar for the CLASSES language. Based on IMPLICIT-REFS, plus 4;; multiple-argument procedures, multiple-declaration letrecs, and 5;; multiple-declaration lets. 6 7(provide (all-defined-out)) 8 9;;;;;;;;;;;;;;;; grammatical specification ;;;;;;;;;;;;;;;; 10 11(define the-lexical-spec 12 '((whitespace (whitespace) skip) 13 (comment ("%" (arbno (not #\newline))) skip) 14 (identifier 15 (letter (arbno (or letter digit "_" "-" "?"))) 16 symbol) 17 (number (digit (arbno digit)) number) 18 (number ("-" digit (arbno digit)) number) 19 )) 20 21(define the-grammar 22 '((program ((arbno class-decl) expression) a-program) 23 24 (expression (number) const-exp) 25 (expression 26 ("-" "(" expression "," expression ")") 27 diff-exp) 28 29 (expression 30 ("+" "(" expression "," expression ")") 31 sum-exp) 32 33 (expression 34 ("zero?" "(" expression ")") 35 zero?-exp) 36 37 (expression 38 ("if" expression "then" expression "else" expression) 39 if-exp) 40 41 (expression (identifier) var-exp) 42 43 (expression 44 ("let" (arbno identifier "=" expression) "in" expression) 45 let-exp) 46 47 (expression 48 ("proc" "(" (separated-list identifier ",") ")" expression) 49 proc-exp) 50 51 (expression 52 ("(" expression (arbno expression) ")") 53 call-exp) 54 55 (expression 56 ("letrec" 57 (arbno identifier "(" (separated-list identifier ",") ")" 58 "=" expression) 59 "in" expression) 60 letrec-exp) 61 62 (expression 63 ("begin" expression (arbno ";" expression) "end") 64 begin-exp) 65 66 (expression 67 ("set" identifier "=" expression) 68 assign-exp) 69 70 (expression 71 ("list" "(" (separated-list expression ",") ")" ) 72 list-exp) 73 74 ;; new productions for oop 75 76 (class-decl 77 ("class" identifier 78 "extends" identifier 79 (arbno "field" identifier) 80 (arbno method-decl) 81 ) 82 a-class-decl) 83 84 (method-decl 85 ("method" identifier 86 "(" (separated-list identifier ",") ")" ; method formals 87 expression 88 ) 89 a-method-decl) 90 91 (expression 92 ("new" identifier "(" (separated-list expression ",") ")") 93 new-object-exp) 94 95 ;; this is special-cased to prevent it from mutation 96 (expression 97 ("self") 98 self-exp) 99 100 (expression 101 ("send" expression identifier 102 "(" (separated-list expression ",") ")") 103 method-call-exp) 104 105 (expression 106 ("super" identifier "(" (separated-list expression ",") ")") 107 super-call-exp) 108 109 )) 110 111;;;;;;;;;;;;;;;; sllgen boilerplate ;;;;;;;;;;;;;;;; 112 113(sllgen:make-define-datatypes the-lexical-spec the-grammar) 114 115(define show-the-datatypes 116 (lambda () (sllgen:list-define-datatypes the-lexical-spec the-grammar))) 117 118(define scan&parse 119 (sllgen:make-string-parser the-lexical-spec the-grammar)) 120 121(define just-scan 122 (sllgen:make-string-scanner the-lexical-spec the-grammar)) 123