diff --git a/beautiful-racket/br/demo/basic/expander.rkt b/beautiful-racket/br/demo/basic/expander.rkt index 2821889..845faf6 100644 --- a/beautiful-racket/br/demo/basic/expander.rkt +++ b/beautiful-racket/br/demo/basic/expander.rkt @@ -8,17 +8,9 @@ ; http://www.atariarchives.org/basicgames/showpage.php?page=i12 (begin-for-syntax - (require racket/match racket/list) + (require racket/list) (define (gather-unique-ids stx) - (define ids empty) - (let loop ([x (syntax->datum stx)]) - (match x - [(or (list 'statement (? symbol? id-name) "=" etc ...) - (list 'statement "input" (list 'print-list etc ...) (? symbol? id-name) ...) - (list 'statement "for" (? symbol? id-name) etc ...)) (set! ids (cons id-name ids))] - [(? list?) (map loop x)] - [else #f])) - (remove-duplicates (flatten ids) eq?))) + (remove-duplicates (map syntax->datum (filter (λ(s) (syntax-property s 'id)) (syntax-flatten stx))) eq?))) (define-macro (basic-module-begin (basic-program PROGRAM-LINE ...)) (with-pattern diff --git a/beautiful-racket/br/demo/basic/parser.rkt b/beautiful-racket/br/demo/basic/parser.rkt index de99f9c..4b01a4e 100644 --- a/beautiful-racket/br/demo/basic/parser.rkt +++ b/beautiful-racket/br/demo/basic/parser.rkt @@ -8,12 +8,12 @@ statement : "end" | "stop" | "gosub" expr | "goto" expr | "if" expr /"then" (statement | expr) [/"else" (statement | expr)] -| "input" [print-list /";"] ID [/"," ID]* -| [/"let"] ID "=" expr +| "input" [print-list /";"] id [/"," id]* +| [/"let"] id "=" expr | "print" [print-list] | "return" -| "for" ID /"=" value /"to" value [/"step" value] -| "next" [ID] +| "for" id /"=" value /"to" value [/"step" value] +| "next" [id] print-list : expr [[";"] [print-list]] @@ -25,10 +25,12 @@ sum : [sum ("+" | "-")] product product : [product ("*" | "/")] value -@value : ID +@value : id | id-expr | /"(" expr /")" | NUMBER | STRING -/id-expr : ID [/"(" expr [/"," expr]* /")"] \ No newline at end of file +/id-expr : id [/"(" expr [/"," expr]* /")"] + +@id : ID