Corrections to the combinator parsers
svn: r6801
This commit is contained in:
parent
9119ec8d10
commit
3a65433b20
|
@ -107,7 +107,7 @@
|
||||||
[my-error (sequence-error-gen name sequence-length)]
|
[my-error (sequence-error-gen name sequence-length)]
|
||||||
[my-walker (seq-walker id-position name my-error)])
|
[my-walker (seq-walker id-position name my-error)])
|
||||||
(opt-lambda (input [last-src (list 0 0 0 0)] [alts 1])
|
(opt-lambda (input [last-src (list 0 0 0 0)] [alts 1])
|
||||||
#;(printf "seq ~a~n" name)
|
#;(!!! (printf "seq ~a~n" name))
|
||||||
(cond
|
(cond
|
||||||
[(eq? input return-name) name]
|
[(eq? input return-name) name]
|
||||||
[(hash-table-get memo-table input #f) (hash-table-get memo-table input)]
|
[(hash-table-get memo-table input #f) (hash-table-get memo-table input)]
|
||||||
|
@ -121,7 +121,7 @@
|
||||||
[(pair? pre-build-ans) (map builder pre-build-ans)]
|
[(pair? pre-build-ans) (map builder pre-build-ans)]
|
||||||
[else pre-build-ans])])
|
[else pre-build-ans])])
|
||||||
(hash-table-put! memo-table input ans)
|
(hash-table-put! memo-table input ans)
|
||||||
#;(printf "sequence ~a returning ~n" name)
|
#;(!!! (printf "sequence ~a returning ~n" name))
|
||||||
ans)])))))
|
ans)])))))
|
||||||
|
|
||||||
;seq-walker: int string error-gen -> [(list parser) (list alpha) parser result (U bool string) (list string) int int -> result
|
;seq-walker: int string error-gen -> [(list parser) (list alpha) parser result (U bool string) (list string) int int -> result
|
||||||
|
@ -171,21 +171,22 @@
|
||||||
(previous? input) (previous? return-name) #f
|
(previous? input) (previous? return-name) #f
|
||||||
look-back used curr-id seen alts last-src)]
|
look-back used curr-id seen alts last-src)]
|
||||||
[else
|
[else
|
||||||
#;(printf "seq-walker called: else case, ~a case of ~a~n"
|
#;(printf "seq-walker called: else case, ~a case of ~a ~ath case ~n"
|
||||||
seq-name (curr-pred return-name))
|
seq-name (curr-pred return-name) (length seen))
|
||||||
(let ([fst (curr-pred input last-src)])
|
(let ([fst (curr-pred input last-src)])
|
||||||
#;(printf "seq-walker predicate returned~n")
|
#;(printf "seq-walker predicate returned~n")
|
||||||
(cond
|
(cond
|
||||||
[(res? fst)
|
[(res? fst)
|
||||||
(cond
|
(cond
|
||||||
[(res-a fst) (next-call fst fst (res-msg fst) (and id-spot? (res-id fst))
|
[(res-a fst) (next-call fst fst (res-msg fst) (and id-spot? (res-id fst))
|
||||||
(res-first-tok fst) alts)]
|
(res-first-tok fst) alts)]
|
||||||
[else
|
[else
|
||||||
|
#;(printf "error situation~n")
|
||||||
(build-error fst (previous? input) (previous? return-name)
|
(build-error fst (previous? input) (previous? return-name)
|
||||||
(car next-preds) look-back used curr-id
|
(car next-preds) look-back used curr-id
|
||||||
seen alts last-src)])]
|
seen alts last-src)])]
|
||||||
[(repeat-res? fst)
|
[(repeat-res? fst)
|
||||||
#;(printf "repeat-res: ~a~n" fst)
|
#;(printf "repeat-res: ~a~n" fst)
|
||||||
(next-call (repeat-res-a fst) fst
|
(next-call (repeat-res-a fst) fst
|
||||||
(res-msg (repeat-res-a fst)) #f
|
(res-msg (repeat-res-a fst)) #f
|
||||||
(res-first-tok (repeat-res-a fst)) alts)]
|
(res-first-tok (repeat-res-a fst)) alts)]
|
||||||
|
@ -402,7 +403,7 @@
|
||||||
this-res))]
|
this-res))]
|
||||||
[else (error 'here5)]))]))])
|
[else (error 'here5)]))]))])
|
||||||
(hash-table-put! memo-table input ans)
|
(hash-table-put! memo-table input ans)
|
||||||
#;(printf "repeat of ~a ended with ans ~a~n" repeat-name ans)
|
#;(!!! (printf "repeat of ~a ended with ans ~a~n" repeat-name ans))
|
||||||
ans)]))))
|
ans)]))))
|
||||||
|
|
||||||
;choice: [list [[list 'a ] -> result]] name -> result
|
;choice: [list [[list 'a ] -> result]] name -> result
|
||||||
|
@ -411,7 +412,7 @@
|
||||||
[num-choices (length opt-list)]
|
[num-choices (length opt-list)]
|
||||||
[choice-names (map (lambda (o) (o return-name)) opt-list)])
|
[choice-names (map (lambda (o) (o return-name)) opt-list)])
|
||||||
(opt-lambda (input [last-src (list 0 0 0 0)] [alts 1])
|
(opt-lambda (input [last-src (list 0 0 0 0)] [alts 1])
|
||||||
#;(printf "choice ~a~n" name)
|
#;(!!! (printf "choice ~a~n" name))
|
||||||
(let ([sub-opts (sub1 (+ alts num-choices))])
|
(let ([sub-opts (sub1 (+ alts num-choices))])
|
||||||
(cond
|
(cond
|
||||||
[(hash-table-get memo-table input #f) (hash-table-get memo-table input)]
|
[(hash-table-get memo-table input #f) (hash-table-get memo-table input)]
|
||||||
|
@ -431,7 +432,7 @@
|
||||||
num-choices choice-names fails))]
|
num-choices choice-names fails))]
|
||||||
[(null? (cdr corrects)) (car corrects)]
|
[(null? (cdr corrects)) (car corrects)]
|
||||||
[else (make-choice-res name corrects)])])
|
[else (make-choice-res name corrects)])])
|
||||||
#;(printf "choice ~a is returning ~a options were ~a ~n" name ans choice-names)
|
#;(!!! (printf "choice ~a is returning ~a options were ~a ~n" name ans choice-names))
|
||||||
(hash-table-put! memo-table input ans) ans)])))))
|
(hash-table-put! memo-table input ans) ans)])))))
|
||||||
|
|
||||||
;correct-list: (list result) -> (list result)
|
;correct-list: (list result) -> (list result)
|
||||||
|
|
|
@ -126,7 +126,8 @@
|
||||||
[pos 0]
|
[pos 0]
|
||||||
[id-pos 0]
|
[id-pos 0]
|
||||||
[terms null])
|
[terms null])
|
||||||
(syntax-case term (sequence choose ^)
|
(syntax-case* term (sequence choose ^)
|
||||||
|
(lambda (a b) (eq? (syntax-e a) (syntax-e b)))
|
||||||
[((sequence a b) . rest)
|
[((sequence a b) . rest)
|
||||||
(loop (syntax rest) (add1 pos) id-pos
|
(loop (syntax rest) (add1 pos) id-pos
|
||||||
(cons (quasisyntax (sequence a b #,name)) terms))]
|
(cons (quasisyntax (sequence a b #,name)) terms))]
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
(lib "string.ss"))
|
(lib "string.ss"))
|
||||||
|
|
||||||
|
|
||||||
(define-signature language-forms^ (program statement expression field))
|
(define-signature language-forms^ (program statement expression field)) ;value-type method-type))
|
||||||
|
|
||||||
(define-signature token-proc^ (old-tokens->new))
|
(define-signature token-proc^ (old-tokens->new))
|
||||||
|
|
||||||
|
@ -336,74 +336,74 @@
|
||||||
(choose (NULL_LIT boolean-lits textual-lits prim-numeric-lits double-lits numeric-lits)
|
(choose (NULL_LIT boolean-lits textual-lits prim-numeric-lits double-lits numeric-lits)
|
||||||
"literal expression"))
|
"literal expression"))
|
||||||
|
|
||||||
(define (new-class expr)
|
(define new-class
|
||||||
(choose ((sequence (new name O_PAREN C_PAREN) id "class instantiation")
|
(choose ((sequence (new name O_PAREN C_PAREN) id)
|
||||||
(sequence (new name O_PAREN (comma-sep expression "arguments") C_PAREN) id "class instantiation"))
|
(sequence (new name O_PAREN (comma-sep expression "arguments") C_PAREN) id))
|
||||||
"class instantiation"))
|
"class instantiation"))
|
||||||
|
|
||||||
(define (new-array type-name expr)
|
(define (new-array type-name)
|
||||||
(sequence (new type-name O_BRACKET expr C_BRACKET (repeat (sequence (O_BRACKET expr C_BRACKET) id)))
|
(sequence (new type-name O_BRACKET expression C_BRACKET (repeat (sequence (O_BRACKET expression C_BRACKET) id)))
|
||||||
id "array instantiation"))
|
id "array instantiation"))
|
||||||
|
|
||||||
(define field-access-end
|
(define field-access-end
|
||||||
(sequence (PERIOD identifier) id "field access"))
|
(sequence (PERIOD identifier) id "field access"))
|
||||||
|
|
||||||
(define (array-access-end expr)
|
(define array-access-end
|
||||||
(sequence (O_BRACKET expr C_BRACKET) id "array access"))
|
(sequence (O_BRACKET (eta expression) C_BRACKET) id "array access"))
|
||||||
|
|
||||||
(define (array-init-maker contents)
|
(define (array-init-maker contents)
|
||||||
(sequence (O_BRACE (comma-sep contents "array elements") C_BRACE) id "array initializations"))
|
(sequence (O_BRACE (comma-sep contents "array elements") C_BRACE) id "array initializations"))
|
||||||
|
|
||||||
(define (array-init type-name expr)
|
(define (array-init type-name)
|
||||||
(letrec ([base-init (array-init-maker expr)]
|
(letrec ([base-init (array-init-maker expression)]
|
||||||
[simple-init (array-init-maker (choose (expr base-init (eta init)) "array initializations"))]
|
[simple-init (array-init-maker (choose (expression base-init (eta init)) "array initializations"))]
|
||||||
[init (array-init-maker (choose (expr simple-init) "array initializations"))])
|
[init (array-init-maker (choose (expression simple-init) "array initializations"))])
|
||||||
(sequence (new type-name init) "array initialization")))
|
(sequence (new type-name init) "array initialization")))
|
||||||
|
|
||||||
(define (binary-expression-end op expr)
|
(define (binary-expression-end op)
|
||||||
(sequence ((^ op) expr) id "binary expression"))
|
(sequence ((^ op) expression) id "binary expression"))
|
||||||
|
|
||||||
(define (if-expr-end expr)
|
(define if-expr-end
|
||||||
(sequence (? expr : expr) id "conditional expression"))
|
(sequence (? (eta expression) : (eta expression)) id "conditional expression"))
|
||||||
|
|
||||||
(define (simple-method-call expr)
|
(define simple-method-call
|
||||||
(choose
|
(choose
|
||||||
((sequence ((^ identifier) O_PAREN C_PAREN) id "method invocation")
|
((sequence ((^ identifier) O_PAREN C_PAREN) id)
|
||||||
(sequence ((^ identifier) O_PAREN (comma-sep expr "argument list") C_PAREN) id "method invocation"))
|
(sequence ((^ identifier) O_PAREN (comma-sep expression "argument list") C_PAREN) id))
|
||||||
"method invocation"))
|
"method invocation"))
|
||||||
|
|
||||||
(define (method-call-end expr)
|
(define method-call-end
|
||||||
(choose
|
(choose
|
||||||
((sequence (PERIOD (^ identifier) O_PAREN C_PAREN) id "method invocation")
|
((sequence (PERIOD (^ identifier) O_PAREN C_PAREN) id)
|
||||||
(sequence (PERIOD (^ identifier) O_PAREN (comma-sep expr "argument list") C_PAREN) id "method invocation"))
|
(sequence (PERIOD (^ identifier) O_PAREN (comma-sep expression "argument list") C_PAREN) id))
|
||||||
"method invocation"))
|
"method invocation"))
|
||||||
|
|
||||||
(define (assignment asignee op expr)
|
(define (assignment asignee op)
|
||||||
(sequence ((^ asignee) op expr) id "assignment"))
|
(sequence ((^ asignee) op expression) id "assignment"))
|
||||||
|
|
||||||
(define (unary-assignment-front expr)
|
(define unary-assignment-front
|
||||||
(choose ((sequence (++ expr) id "unary modification")
|
(choose ((sequence (++ expression) id)
|
||||||
(sequence (-- expr) id "unary modification")) "unary modification"))
|
(sequence (-- expression) id)) "unary modification"))
|
||||||
|
|
||||||
(define (unary-assignment-back base)
|
(define (unary-assignment-back base)
|
||||||
(choose ((sequence (base ++) id "unary modification")
|
(choose ((sequence (base ++) id)
|
||||||
(sequence (base --) id "unary modification")) "unary modification"))
|
(sequence (base --) id)) "unary modification"))
|
||||||
|
|
||||||
(define (cast type expr)
|
(define (cast type)
|
||||||
(sequence (O_PAREN type C_PAREN expr) "cast expression"))
|
(sequence (O_PAREN type C_PAREN expression) "cast expression"))
|
||||||
|
|
||||||
(define instanceof-back
|
(define instanceof-back
|
||||||
(sequence (instanceof name) "instanceof expression"))
|
(sequence (instanceof name) "instanceof expression"))
|
||||||
|
|
||||||
(define (super-call expr)
|
(define super-call
|
||||||
(choose ((sequence (super PERIOD identifier O_PAREN C_PAREN) id "super method invocation")
|
(choose ((sequence (super PERIOD identifier O_PAREN C_PAREN) id)
|
||||||
(sequence (super PERIOD identifier O_PAREN (comma-sep expr "arguments") C_PAREN) id "super method invocation"))
|
(sequence (super PERIOD identifier O_PAREN (comma-sep expression "arguments") C_PAREN) id))
|
||||||
"super method invocation"))
|
"super method invocation"))
|
||||||
|
|
||||||
(define (checks expr)
|
(define checks
|
||||||
(choose
|
(choose
|
||||||
((sequence (check expr expect expr) id "check expression")
|
((sequence (check (eta expression) expect (eta expression)) id)
|
||||||
(sequence (check expr expect expr within expr) id "check expression"))
|
(sequence (check (eta expression) expect (eta expression) within (eta expression)) id))
|
||||||
"check expression"))
|
"check expression"))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -422,8 +422,8 @@
|
||||||
|
|
||||||
(define (return-s expr opt?)
|
(define (return-s expr opt?)
|
||||||
(cond
|
(cond
|
||||||
[opt? (choose ((sequence (return expr SEMI_COLON) id "return statement")
|
[opt? (choose ((sequence (return expr SEMI_COLON) id)
|
||||||
(sequence (return SEMI_COLON) id "return statement")) "return statement")]
|
(sequence (return SEMI_COLON) id)) "return statement")]
|
||||||
[else (sequence (return expr SEMI_COLON) id "return statement")]))
|
[else (sequence (return expr SEMI_COLON) id "return statement")]))
|
||||||
|
|
||||||
(define (this-call expr)
|
(define (this-call expr)
|
||||||
|
@ -634,23 +634,22 @@
|
||||||
(export language-forms^)
|
(export language-forms^)
|
||||||
|
|
||||||
(define unique-base
|
(define unique-base
|
||||||
(simple-expression
|
(choose
|
||||||
(list (literals (list boolean-lits textual-lits prim-numeric-lits double-lits))
|
((literals (list boolean-lits textual-lits prim-numeric-lits double-lits))
|
||||||
this
|
this
|
||||||
identifier
|
identifier
|
||||||
(new-class (eta expression))
|
new-class
|
||||||
(simple-method-call (eta expression))
|
simple-method-call
|
||||||
(sequence (O_PAREN (eta expression) C_PAREN) id "expression")
|
(sequence (O_PAREN (eta expression) C_PAREN) id)
|
||||||
(sequence (! (eta expression)) id "conditional expression")
|
(sequence (! (eta expression)) id "conditional expression")
|
||||||
(sequence (MINUS (eta expression)) id "negation expression")
|
(sequence (MINUS (eta expression)) id "negation expression")
|
||||||
(checks (eta expression)))))
|
checks) "expression"))
|
||||||
|
|
||||||
(define unique-end
|
(define unique-end
|
||||||
(simple-expression
|
(choose (field-access-end
|
||||||
(list field-access-end
|
method-call-end
|
||||||
(method-call-end (eta expression))
|
(binary-expression-end (bin-ops (list math-ops compare-ops bool-ops))))
|
||||||
(binary-expression-end (bin-ops (list math-ops compare-ops bool-ops))
|
"expression"))
|
||||||
(eta expression)))))
|
|
||||||
|
|
||||||
(define expression
|
(define expression
|
||||||
(sequence (unique-base (repeat unique-end)) id "expression"))
|
(sequence (unique-base (repeat unique-end)) id "expression"))
|
||||||
|
@ -679,51 +678,46 @@
|
||||||
(make-program #f (repeat import-dec) (repeat (top-member (list class interface)))))
|
(make-program #f (repeat import-dec) (repeat (top-member (list class interface)))))
|
||||||
)
|
)
|
||||||
|
|
||||||
(define-signature int+acc^ (intermediate+access-prog))
|
|
||||||
|
|
||||||
(define-unit intermediate-grammar@
|
(define-unit intermediate-grammar@
|
||||||
(import combinator-parser^ java-operators^ java-separators^ (prefix tok: java-definition-keywords^)
|
(import combinator-parser^ java-operators^ java-separators^ (prefix tok: java-definition-keywords^)
|
||||||
java-statement-keywords^ java-type-keywords^ java-ids^
|
java-statement-keywords^ java-type-keywords^ java-ids^
|
||||||
java-types^ java-access^ java-ops^ general-productions^ java-variables^
|
java-types^ java-access^ java-ops^ general-productions^ java-variables^
|
||||||
expression-maker^ expr-lits^ expr-terms+^ expr-tails^ statements^
|
expression-maker^ expr-lits^ expr-terms+^ expr-tails^ statements^
|
||||||
fields^ methods^ ctors^ interfaces^ classes^ top-forms^ id^)
|
fields^ methods^ ctors^ interfaces^ classes^ top-forms^ id^)
|
||||||
(export language-forms^ int+acc^)
|
(export language-forms^)
|
||||||
|
|
||||||
(define unique-base
|
(define unique-base
|
||||||
(simple-expression
|
(choose ((literals (list null-lit boolean-lits textual-lits prim-numeric-lits double-lits))
|
||||||
(list (literals (list null-lit boolean-lits textual-lits prim-numeric-lits double-lits))
|
this
|
||||||
this
|
identifier
|
||||||
identifier
|
new-class
|
||||||
(new-class (eta expression))
|
simple-method-call
|
||||||
(simple-method-call (eta expression))
|
(sequence (O_PAREN (eta expression) C_PAREN) id)
|
||||||
(sequence (O_PAREN (eta expression) C_PAREN) id "expression")
|
(sequence (! (eta expression)) id "conditional expression")
|
||||||
(sequence (! (eta expression)) id "conditional expression")
|
(sequence (MINUS (eta expression)) id "negation expression")
|
||||||
(sequence (MINUS (eta expression)) id "negation expression")
|
(cast (value+name-type prim-type))
|
||||||
(cast (value+name-type prim-type) (eta expression))
|
super-call
|
||||||
(super-call (eta expression))
|
checks) "expression"))
|
||||||
(checks (eta expression)))))
|
|
||||||
|
|
||||||
(define unique-end
|
(define unique-end
|
||||||
(simple-expression
|
(choose (field-access-end
|
||||||
(list field-access-end
|
method-call-end
|
||||||
(method-call-end (eta expression))
|
(binary-expression-end (bin-ops (list math-ops compare-ops bool-ops bit-ops)))
|
||||||
(binary-expression-end (bin-ops (list math-ops compare-ops bool-ops bit-ops))
|
instanceof-back) "expression"))
|
||||||
(eta expression))
|
|
||||||
instanceof-back)))
|
|
||||||
|
|
||||||
(define expression
|
(define expression
|
||||||
(sequence (unique-base (repeat unique-end)) id "expression"))
|
(sequence (unique-base (repeat unique-end)) id "expression"))
|
||||||
|
|
||||||
(define stmt-expr
|
(define stmt-expr
|
||||||
(simple-expression (list (new-class expression)
|
(choose (new-class
|
||||||
(super-call expression)
|
super-call
|
||||||
(sequence (expression (method-call-end expression))
|
(sequence (expression (method-call-end expression))
|
||||||
id "method call")
|
id "method call")
|
||||||
(assignment
|
(assignment
|
||||||
(choose (identifier
|
(choose (identifier
|
||||||
(sequence (unique-base field-access-end) id))
|
(sequence (unique-base field-access-end) id))
|
||||||
"assignee")
|
"assignee")
|
||||||
EQUAL expression))))
|
EQUAL)) "expression"))
|
||||||
|
|
||||||
(define statement
|
(define statement
|
||||||
(make-statement
|
(make-statement
|
||||||
|
@ -734,39 +728,22 @@
|
||||||
(sequence (stmt-expr SEMI_COLON) id "statement"))))
|
(sequence (stmt-expr SEMI_COLON) id "statement"))))
|
||||||
|
|
||||||
(define field (make-field #f (value+name-type prim-type) expression #t))
|
(define field (make-field #f (value+name-type prim-type) expression #t))
|
||||||
(define intermediate+access-field (make-field access-mods (value+name-type prim-type) expression #t))
|
|
||||||
|
|
||||||
(define method-sig-no-abs
|
(define method-sig-no-abs
|
||||||
(method-signature #f (method-type (value+name-type prim-type)) args #f identifier))
|
(method-signature #f (method-type (value+name-type prim-type)) args #f identifier))
|
||||||
(define method-sig-abs
|
(define method-sig-abs
|
||||||
(method-signature tok:abstract (method-type (value+name-type prim-type)) args #f identifier))
|
(method-signature tok:abstract (method-type (value+name-type prim-type)) args #f identifier))
|
||||||
|
|
||||||
(define intermediate+access-method-sig-no-abs
|
|
||||||
(method-signature access-mods (method-type (value+name-type prim-type)) args #f identifier))
|
|
||||||
(define intermediate+access-method-sig-abs
|
|
||||||
(method-signature (method-mods access-mods)
|
|
||||||
(method-type (value+name-type prim-type)) args #f identifier))
|
|
||||||
|
|
||||||
(define method
|
(define method
|
||||||
(choose ((make-method method-sig-no-abs statement)
|
(choose ((make-method method-sig-no-abs statement)
|
||||||
(method-header method-sig-abs)) "method definition"))
|
(method-header method-sig-abs)) "method definition"))
|
||||||
|
|
||||||
(define intermediate+access-method
|
|
||||||
(choose ((make-method intermediate+access-method-sig-no-abs statement)
|
|
||||||
(method-header intermediate+access-method-sig-abs)) "method definition"))
|
|
||||||
|
|
||||||
(define constructor
|
(define constructor
|
||||||
(make-constructor #f
|
(make-constructor #f
|
||||||
(choose ((sequence ((super-call expression) (repeat statement)) id)
|
(choose ((sequence ((super-call expression) (repeat statement)) id)
|
||||||
(sequence ((this-call expression) (repeat statement)) id)
|
(sequence ((this-call expression) (repeat statement)) id)
|
||||||
(repeat statement)) "constructor body")))
|
(repeat statement)) "constructor body")))
|
||||||
|
|
||||||
(define intermediate+access-constructor
|
|
||||||
(make-constructor access-mods
|
|
||||||
(choose ((sequence ((super-call expression) (repeat statement)) id)
|
|
||||||
(sequence ((this-call expression) (repeat statement)) id)
|
|
||||||
(repeat statement)) "constructor body")))
|
|
||||||
|
|
||||||
(define interface
|
(define interface
|
||||||
(interface-def
|
(interface-def
|
||||||
#f
|
#f
|
||||||
|
@ -778,21 +755,95 @@
|
||||||
(implements-dec (comma-sep identifier "interfaces"))
|
(implements-dec (comma-sep identifier "interfaces"))
|
||||||
(repeat (class-body (list field method constructor)))))
|
(repeat (class-body (list field method constructor)))))
|
||||||
|
|
||||||
(define intermediate+access-class
|
|
||||||
(class-def tok:abstract (extend-dec identifier) (implements-dec (comma-sep identifier "interfaces"))
|
|
||||||
(repeat (class-body (list intermediate+access-field
|
|
||||||
intermediate+access-method
|
|
||||||
intermediate+access-constructor)))))
|
|
||||||
|
|
||||||
(define program
|
(define program
|
||||||
(make-program #f (repeat import-dec) (repeat (top-member (list class interface)))))
|
(make-program #f (repeat import-dec) (repeat (top-member (list class interface)))))
|
||||||
|
|
||||||
(define intermediate+access-prog
|
|
||||||
(make-program #f (repeat import-dec)
|
|
||||||
(repeat (top-member (list intermediate+access-class interface)))))
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(define-unit intermediate+access-grammar@
|
||||||
|
(import combinator-parser^ java-operators^ java-separators^ (prefix tok: java-definition-keywords^)
|
||||||
|
java-statement-keywords^ java-type-keywords^ java-ids^
|
||||||
|
java-types^ java-access^ java-ops^ general-productions^ java-variables^
|
||||||
|
expression-maker^ expr-lits^ expr-terms+^ expr-tails^ statements^
|
||||||
|
fields^ methods^ ctors^ interfaces^ classes^ top-forms^ id^)
|
||||||
|
(export language-forms^)
|
||||||
|
|
||||||
|
(define unique-base
|
||||||
|
(choose ((literals (list null-lit boolean-lits textual-lits prim-numeric-lits double-lits))
|
||||||
|
this
|
||||||
|
identifier
|
||||||
|
new-class
|
||||||
|
simple-method-call
|
||||||
|
(sequence (O_PAREN (eta expression) C_PAREN) id)
|
||||||
|
(sequence (! (eta expression)) id "conditional expression")
|
||||||
|
(sequence (MINUS (eta expression)) id "negation expression")
|
||||||
|
(cast (value+name-type prim-type))
|
||||||
|
super-call
|
||||||
|
checks) "expression"))
|
||||||
|
|
||||||
|
(define unique-end
|
||||||
|
(choose (field-access-end
|
||||||
|
method-call-end
|
||||||
|
(binary-expression-end (bin-ops (list math-ops compare-ops bool-ops bit-ops)))
|
||||||
|
instanceof-back) "expression"))
|
||||||
|
|
||||||
|
(define expression
|
||||||
|
(sequence (unique-base (repeat unique-end)) id "expression"))
|
||||||
|
|
||||||
|
(define stmt-expr
|
||||||
|
(choose (new-class
|
||||||
|
super-call
|
||||||
|
(sequence (expression (method-call-end expression))
|
||||||
|
id "method call")
|
||||||
|
(assignment
|
||||||
|
(choose (identifier
|
||||||
|
(sequence (unique-base field-access-end) id))
|
||||||
|
"assignee")
|
||||||
|
EQUAL)) "expression"))
|
||||||
|
|
||||||
|
(define statement
|
||||||
|
(make-statement
|
||||||
|
(list (if-s expression (eta statement) #f)
|
||||||
|
(return-s expression #t)
|
||||||
|
(variable-declaration (value+name-type prim-type) expression #f "local variable")
|
||||||
|
(block (repeat (eta statement)))
|
||||||
|
(sequence (stmt-expr SEMI_COLON) id "statement"))))
|
||||||
|
|
||||||
|
(define field (make-field access-mods (value+name-type prim-type) expression #t))
|
||||||
|
|
||||||
|
(define method-sig-no-abs
|
||||||
|
(method-signature access-mods (method-type (value+name-type prim-type)) args #f identifier))
|
||||||
|
(define method-sig-abs
|
||||||
|
(method-signature (method-mods access-mods)
|
||||||
|
(method-type (value+name-type prim-type)) args #f identifier))
|
||||||
|
|
||||||
|
(define method
|
||||||
|
(choose ((make-method method-sig-no-abs statement)
|
||||||
|
(method-header method-sig-abs)) "method definition"))
|
||||||
|
|
||||||
|
(define constructor
|
||||||
|
(make-constructor access-mods
|
||||||
|
(choose ((sequence ((super-call expression) (repeat statement)) id)
|
||||||
|
(sequence ((this-call expression) (repeat statement)) id)
|
||||||
|
(repeat statement)) "constructor body")))
|
||||||
|
|
||||||
|
(define interface
|
||||||
|
(interface-def
|
||||||
|
#f
|
||||||
|
(sequence (tok:extends (comma-sep identifier "interfaces")) id "extends")
|
||||||
|
(repeat (sequence (method-sig-no-abs SEMI_COLON) id "method signature"))))
|
||||||
|
|
||||||
|
(define class
|
||||||
|
(class-def tok:abstract (extend-dec identifier) (implements-dec (comma-sep identifier "interfaces"))
|
||||||
|
(repeat (class-body (list field method constructor)))))
|
||||||
|
|
||||||
|
(define program
|
||||||
|
(make-program #f (repeat import-dec)
|
||||||
|
(repeat (top-member (list class interface)))))
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
(define-unit advanced-grammar@
|
(define-unit advanced-grammar@
|
||||||
(import combinator-parser^ java-operators^ java-separators^ (prefix tok: java-definition-keywords^)
|
(import combinator-parser^ java-operators^ java-separators^ (prefix tok: java-definition-keywords^)
|
||||||
java-statement-keywords^ java-type-keywords^ java-ids^
|
java-statement-keywords^ java-type-keywords^ java-ids^
|
||||||
|
@ -807,7 +858,7 @@
|
||||||
(list (literals (list null-lit boolean-lits textual-lits prim-numeric-lits double-lits))
|
(list (literals (list null-lit boolean-lits textual-lits prim-numeric-lits double-lits))
|
||||||
this
|
this
|
||||||
IDENTIFIER
|
IDENTIFIER
|
||||||
(new-class (eta expression))
|
new-class
|
||||||
(simple-method-call (eta expression))
|
(simple-method-call (eta expression))
|
||||||
(new-array (value+name-type prim-type) (eta expression))
|
(new-array (value+name-type prim-type) (eta expression))
|
||||||
(sequence (O_PAREN (eta expression) C_PAREN) id "expression")
|
(sequence (O_PAREN (eta expression) C_PAREN) id "expression")
|
||||||
|
@ -831,7 +882,7 @@
|
||||||
(sequence (unique-base (repeat unique-end)) id "expression"))
|
(sequence (unique-base (repeat unique-end)) id "expression"))
|
||||||
|
|
||||||
(define stmt-expr
|
(define stmt-expr
|
||||||
(simple-expression (list (new-class expression)
|
(simple-expression (list new-class
|
||||||
(super-call expression)
|
(super-call expression)
|
||||||
(sequence (expression
|
(sequence (expression
|
||||||
(method-call-end expression)) id "method call")
|
(method-call-end expression)) id "method call")
|
||||||
|
@ -1056,6 +1107,31 @@
|
||||||
java-terminals@ types@ mods@ operators@ general@ unqualified-java-variables@
|
java-terminals@ types@ mods@ operators@ general@ unqualified-java-variables@
|
||||||
expressions@ statements@ members@ interface@ class@ top-forms@
|
expressions@ statements@ members@ interface@ class@ top-forms@
|
||||||
intermediate-grammar@ token@ interactions-parsers@))
|
intermediate-grammar@ token@ interactions-parsers@))
|
||||||
|
|
||||||
|
(define-compound-unit/infer intermediate+access-file-parser@
|
||||||
|
(import)
|
||||||
|
(export parsers^ token-proc^ err^)
|
||||||
|
(link java-dictionary@ combinator-parser-tools@ file-constants@ id@
|
||||||
|
java-terminals@ types@ mods@ operators@ general@ unqualified-java-variables@
|
||||||
|
expressions@ statements@ members@ interface@ class@ top-forms@
|
||||||
|
intermediate+access-grammar@ token@ definition-parsers@))
|
||||||
|
|
||||||
|
|
||||||
|
(define-compound-unit/infer intermediate+access-definitions-parser@
|
||||||
|
(import)
|
||||||
|
(export parsers^ token-proc^ err^)
|
||||||
|
(link java-dictionary@ combinator-parser-tools@ de-constants@ id@
|
||||||
|
java-terminals@ types@ mods@ operators@ general@ unqualified-java-variables@
|
||||||
|
expressions@ statements@ members@ interface@ class@ top-forms@
|
||||||
|
intermediate+access-grammar@ token@ definition-parsers@))
|
||||||
|
|
||||||
|
(define-compound-unit/infer intermediate+access-interactions-parsers@
|
||||||
|
(import)
|
||||||
|
(export parsers^ token-proc^ err^)
|
||||||
|
(link java-dictionary@ combinator-parser-tools@ interact-constants@ id@
|
||||||
|
java-terminals@ types@ mods@ operators@ general@ unqualified-java-variables@
|
||||||
|
expressions@ statements@ members@ interface@ class@ top-forms@
|
||||||
|
intermediate+access-grammar@ token@ interactions-parsers@))
|
||||||
|
|
||||||
(define-compound-unit/infer advanced-file-parser@
|
(define-compound-unit/infer advanced-file-parser@
|
||||||
(import)
|
(import)
|
||||||
|
@ -1084,6 +1160,7 @@
|
||||||
|
|
||||||
;
|
;
|
||||||
(provide advanced-file-parser@ advanced-definitions-parser@ advanced-interactions-parsers@
|
(provide advanced-file-parser@ advanced-definitions-parser@ advanced-interactions-parsers@
|
||||||
|
intermediate+access-file-parser@ intermediate+access-definitions-parser@ intermediate+access-interactions-parsers@
|
||||||
intermediate-file-parser@ intermediate-definitions-parser@ intermediate-interactions-parsers@
|
intermediate-file-parser@ intermediate-definitions-parser@ intermediate-interactions-parsers@
|
||||||
beginner-file-parser@ beginner-definitions-parser@ beginner-interactions-parsers@
|
beginner-file-parser@ beginner-definitions-parser@ beginner-interactions-parsers@
|
||||||
parsers^ token-proc^)
|
parsers^ token-proc^)
|
||||||
|
|
|
@ -344,6 +344,14 @@
|
||||||
(define-values/invoke-unit intermediate-interactions-parsers@
|
(define-values/invoke-unit intermediate-interactions-parsers@
|
||||||
(import)
|
(import)
|
||||||
(export (prefix intermediate-int: parsers^) (prefix intermediate-int: err^)))
|
(export (prefix intermediate-int: parsers^) (prefix intermediate-int: err^)))
|
||||||
|
|
||||||
|
(define-values/invoke-unit intermediate+access-definitions-parser@
|
||||||
|
(import)
|
||||||
|
(export (prefix intermediate+acc-def: parsers^) (prefix intermediate+acc-def: err^)))
|
||||||
|
(define-values/invoke-unit intermediate+access-interactions-parsers@
|
||||||
|
(import)
|
||||||
|
(export (prefix intermediate+acc-int: parsers^) (prefix intermediate+acc-int: err^)))
|
||||||
|
|
||||||
|
|
||||||
(define-values/invoke-unit advanced-definitions-parser@
|
(define-values/invoke-unit advanced-definitions-parser@
|
||||||
(import)
|
(import)
|
||||||
|
@ -367,7 +375,8 @@
|
||||||
beginner-def:err? beginner-def:err-msg beginner-def:err-src))
|
beginner-def:err? beginner-def:err-msg beginner-def:err-src))
|
||||||
(define parse-intermediate (parse intermediate-def:parse-program
|
(define parse-intermediate (parse intermediate-def:parse-program
|
||||||
intermediate-def:err? intermediate-def:err-msg intermediate-def:err-src))
|
intermediate-def:err? intermediate-def:err-msg intermediate-def:err-src))
|
||||||
(define parse-intermediate+access null #;(parse def:parse-intermediate+access def:err? def:err-msg def:err-src))
|
(define parse-intermediate+access (parse intermediate+acc-def:parse-program
|
||||||
|
intermediate+acc-def:err? intermediate+acc-def:err-msg intermediate+acc-def:err-src))
|
||||||
(define parse-advanced (parse advanced-def:parse-program
|
(define parse-advanced (parse advanced-def:parse-program
|
||||||
advanced-def:err? advanced-def:err-msg advanced-def:err-src))
|
advanced-def:err? advanced-def:err-msg advanced-def:err-src))
|
||||||
(define parse-beginner-interact (parse beginner-int:parse-program
|
(define parse-beginner-interact (parse beginner-int:parse-program
|
||||||
|
|
Loading…
Reference in New Issue
Block a user