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