
The eopl language is now racket-based rather than mzscheme-based. This test-suite, which was originally distributed on the book's web-site has been re-written in the new language. Changes include dropping all drscheme-init.scm and top.scm files. Remaining files were renamed to use the .rkt extension and edited to use the #lang syntax (instead of modulue). Require and provide forms were changed to reflect racket's syntax instead of mzscheme's (eg, only-in vs. only). Several occurrences of one-armed ifs were changed to use when and unless. All tests have been run successfully.
123 lines
3.0 KiB
Racket
Executable File
123 lines
3.0 KiB
Racket
Executable File
#lang eopl
|
|
|
|
;; grammar for the CLASSES language. Based on IMPLICIT-REFS, plus
|
|
;; multiple-argument procedures, multiple-declaration letrecs, and
|
|
;; multiple-declaration lets.
|
|
|
|
(provide (all-defined-out))
|
|
|
|
;;;;;;;;;;;;;;;; grammatical specification ;;;;;;;;;;;;;;;;
|
|
|
|
(define the-lexical-spec
|
|
'((whitespace (whitespace) skip)
|
|
(comment ("%" (arbno (not #\newline))) skip)
|
|
(identifier
|
|
(letter (arbno (or letter digit "_" "-" "?")))
|
|
symbol)
|
|
(number (digit (arbno digit)) number)
|
|
(number ("-" digit (arbno digit)) number)
|
|
))
|
|
|
|
(define the-grammar
|
|
'((program ((arbno class-decl) expression) a-program)
|
|
|
|
(expression (number) const-exp)
|
|
(expression
|
|
("-" "(" expression "," expression ")")
|
|
diff-exp)
|
|
|
|
(expression
|
|
("+" "(" expression "," expression ")")
|
|
sum-exp)
|
|
|
|
(expression
|
|
("zero?" "(" expression ")")
|
|
zero?-exp)
|
|
|
|
(expression
|
|
("if" expression "then" expression "else" expression)
|
|
if-exp)
|
|
|
|
(expression (identifier) var-exp)
|
|
|
|
(expression
|
|
("let" (arbno identifier "=" expression) "in" expression)
|
|
let-exp)
|
|
|
|
(expression
|
|
("proc" "(" (separated-list identifier ",") ")" expression)
|
|
proc-exp)
|
|
|
|
(expression
|
|
("(" expression (arbno expression) ")")
|
|
call-exp)
|
|
|
|
(expression
|
|
("letrec"
|
|
(arbno identifier "(" (separated-list identifier ",") ")"
|
|
"=" expression)
|
|
"in" expression)
|
|
letrec-exp)
|
|
|
|
(expression
|
|
("begin" expression (arbno ";" expression) "end")
|
|
begin-exp)
|
|
|
|
(expression
|
|
("set" identifier "=" expression)
|
|
assign-exp)
|
|
|
|
(expression
|
|
("list" "(" (separated-list expression ",") ")" )
|
|
list-exp)
|
|
|
|
;; new productions for oop
|
|
|
|
(class-decl
|
|
("class" identifier
|
|
"extends" identifier
|
|
(arbno "field" identifier)
|
|
(arbno method-decl)
|
|
)
|
|
a-class-decl)
|
|
|
|
(method-decl
|
|
("method" identifier
|
|
"(" (separated-list identifier ",") ")" ; method formals
|
|
expression
|
|
)
|
|
a-method-decl)
|
|
|
|
(expression
|
|
("new" identifier "(" (separated-list expression ",") ")")
|
|
new-object-exp)
|
|
|
|
;; this is special-cased to prevent it from mutation
|
|
(expression
|
|
("self")
|
|
self-exp)
|
|
|
|
(expression
|
|
("send" expression identifier
|
|
"(" (separated-list expression ",") ")")
|
|
method-call-exp)
|
|
|
|
(expression
|
|
("super" identifier "(" (separated-list expression ",") ")")
|
|
super-call-exp)
|
|
|
|
))
|
|
|
|
;;;;;;;;;;;;;;;; sllgen boilerplate ;;;;;;;;;;;;;;;;
|
|
|
|
(sllgen:make-define-datatypes the-lexical-spec the-grammar)
|
|
|
|
(define show-the-datatypes
|
|
(lambda () (sllgen:list-define-datatypes the-lexical-spec the-grammar)))
|
|
|
|
(define scan&parse
|
|
(sllgen:make-string-parser the-lexical-spec the-grammar))
|
|
|
|
(define just-scan
|
|
(sllgen:make-string-scanner the-lexical-spec the-grammar))
|