Corrections to parser for error recovery; correction to bug in check based on setting fields in beginner
svn: r7068
This commit is contained in:
parent
d913915068
commit
1d44d5765c
|
@ -120,7 +120,7 @@
|
||||||
(res-used (repeat-res-a r))
|
(res-used (repeat-res-a r))
|
||||||
(repeat-res-stop r)
|
(repeat-res-stop r)
|
||||||
(res-first-tok (repeat-res-a r)))]
|
(res-first-tok (repeat-res-a r)))]
|
||||||
[else (error 'parser-internal-error1 r)]))]
|
[else (error 'parser-internal-error1 (format "~a" r))]))]
|
||||||
[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 1 0 1 0)] [alts 1])
|
(opt-lambda (input [last-src (list 1 0 1 0)] [alts 1])
|
||||||
|
@ -135,12 +135,20 @@
|
||||||
[ans
|
[ans
|
||||||
(cond
|
(cond
|
||||||
[(and (res? pre-build-ans) (res-a pre-build-ans)) (builder pre-build-ans)]
|
[(and (res? pre-build-ans) (res-a pre-build-ans)) (builder pre-build-ans)]
|
||||||
|
[(and (pair? pre-build-ans) (null? (cdr pre-build-ans))) (builder (car pre-build-ans))]
|
||||||
[(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))
|
||||||
|
#;(when (res? pre-build-ans) (printf "pre-build is a res~n"))
|
||||||
|
#;(when (pair? pre-build-ans) (printf "pre-build is a pair of length ~a~n"
|
||||||
|
(length pre-build-ans)))
|
||||||
|
#;(when (and (pair? pre-build-ans) (= 1 (length pre-build-ans)))
|
||||||
|
(printf "pre-build-ans a pair containing a res? ~a~n" (res? (car pre-build-ans))))
|
||||||
|
#;(when (and (pair? pre-build-ans) (= 1 (length pre-build-ans)) (res? (car pre-build-ans)))
|
||||||
|
(printf "pre-build-ans a pair containing ~a~n" (car pre-build-ans)))
|
||||||
#;(printf "prebuild answer is ~a~n" pre-build-ans)
|
#;(printf "prebuild answer is ~a~n" pre-build-ans)
|
||||||
#;(!!! (printf "answer is ~a ~n" ans))
|
#;(printf "answer is ~a ~n" ans)
|
||||||
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
|
||||||
|
@ -158,7 +166,7 @@
|
||||||
(or id (res-id (repeat-res-a rst)))
|
(or id (res-id (repeat-res-a rst)))
|
||||||
(+ used (res-used (repeat-res-a rst)))
|
(+ used (res-used (repeat-res-a rst)))
|
||||||
(repeat-res-stop rst) tok)]
|
(repeat-res-stop rst) tok)]
|
||||||
[else (error 'parser-internal-error2 rst)]
|
[else (error 'parser-internal-error2 (format "~a" rst))]
|
||||||
))]
|
))]
|
||||||
[walker
|
[walker
|
||||||
(lambda (subs input previous? look-back curr-id seen used alts last-src)
|
(lambda (subs input previous? look-back curr-id seen used alts last-src)
|
||||||
|
@ -177,6 +185,10 @@
|
||||||
(make-src-lst (position-token-start-pos (res-first-tok old-result))
|
(make-src-lst (position-token-start-pos (res-first-tok old-result))
|
||||||
(position-token-end-pos (res-first-tok old-result)))
|
(position-token-end-pos (res-first-tok old-result)))
|
||||||
last-src))])
|
last-src))])
|
||||||
|
#;(printf "next-call ~a ~a: ~a ~a ~a ~a~n"
|
||||||
|
seq-name (length seen) old-result (res? rsts)
|
||||||
|
(and (res? rsts) (res-a rsts))
|
||||||
|
(and (res? rsts) (choice-fail? (res-possible-error rsts))))
|
||||||
(cond
|
(cond
|
||||||
[(and (res? rsts) (res-a rsts))
|
[(and (res? rsts) (res-a rsts))
|
||||||
(next-res old-answer new-id old-used tok rsts)]
|
(next-res old-answer new-id old-used tok rsts)]
|
||||||
|
@ -189,7 +201,7 @@
|
||||||
(correct-list (choice-res-matches rsts)))]
|
(correct-list (choice-res-matches rsts)))]
|
||||||
[(repeat-res? rsts)
|
[(repeat-res? rsts)
|
||||||
(next-res old-answer new-id old-used tok rsts)]
|
(next-res old-answer new-id old-used tok rsts)]
|
||||||
[else (error 'parser-internal-error3 rsts)])))])
|
[else (error 'parser-internal-error3 (format "~a" rsts))])))])
|
||||||
(cond
|
(cond
|
||||||
[(null? subs) (error 'end-of-subs)]
|
[(null? subs) (error 'end-of-subs)]
|
||||||
[(null? next-preds)
|
[(null? next-preds)
|
||||||
|
@ -247,9 +259,11 @@
|
||||||
(res-msg (repeat-res-a res)) #f
|
(res-msg (repeat-res-a res)) #f
|
||||||
(res-first-tok (repeat-res-a res))
|
(res-first-tok (repeat-res-a res))
|
||||||
new-alts)]
|
new-alts)]
|
||||||
[else (!!! (error 'parser-internal-error4 res))]))
|
[else (!!! (error 'parser-internal-error4 (format "~a" res)))]))
|
||||||
lst)]
|
(flatten lst))]
|
||||||
[(correct-rsts) (correct-list rsts)])
|
[(correct-rsts) (flatten (correct-list rsts))])
|
||||||
|
#;(printf "case ~a ~a, choice case: intermediate results are ~a~n"
|
||||||
|
seq-name (length seen) lst)
|
||||||
(cond
|
(cond
|
||||||
[(null? correct-rsts)
|
[(null? correct-rsts)
|
||||||
(let ([fails
|
(let ([fails
|
||||||
|
@ -281,7 +295,7 @@
|
||||||
(values 'sub-seq (sequence-fail-expected fail) fail)]
|
(values 'sub-seq (sequence-fail-expected fail) fail)]
|
||||||
[(choice-fail? fail) (values 'choice null fail)]
|
[(choice-fail? fail) (values 'choice null fail)]
|
||||||
[(options-fail? fail) (values 'options null fail)]
|
[(options-fail? fail) (values 'options null fail)]
|
||||||
[else (error 'parser-internal-error5 fail)]))
|
[else (error 'parser-internal-error5 (format "~a" fail))]))
|
||||||
|
|
||||||
;update-src: symbol src-list src-list token -> src-list
|
;update-src: symbol src-list src-list token -> src-list
|
||||||
(define (update-src error-kind src prev-src tok)
|
(define (update-src error-kind src prev-src tok)
|
||||||
|
@ -312,6 +326,20 @@
|
||||||
[(repeat-res? rpt)
|
[(repeat-res? rpt)
|
||||||
(let ([inn (repeat-res-a rpt)]
|
(let ([inn (repeat-res-a rpt)]
|
||||||
[stop (repeat-res-stop rpt)])
|
[stop (repeat-res-stop rpt)])
|
||||||
|
#;(printf "in repeat->res for ~a~n" name)
|
||||||
|
#;(printf "fail-type? stop ~a~n" (fail-type? stop))
|
||||||
|
#;(printf "stop ~a~n" stop)
|
||||||
|
#;(printf "choice-res? back ~a~n" (choice-res? back))
|
||||||
|
#;(when (choice-res? back) (printf "choice-res-errors back ~a~n"
|
||||||
|
(choice-res-errors back)))
|
||||||
|
#;(when (and (fail-type? stop)
|
||||||
|
(choice-res? back)
|
||||||
|
(choice-res-errors back))
|
||||||
|
(printf "chances ~a > ~a -> ~a ~n"
|
||||||
|
(fail-type-chance (choice-res-errors back))
|
||||||
|
(fail-type-chance stop)
|
||||||
|
(> (fail-type-chance (choice-res-errors back))
|
||||||
|
(fail-type-chance stop))))
|
||||||
(cond
|
(cond
|
||||||
[(fail-type? stop)
|
[(fail-type? stop)
|
||||||
(make-res (res-a inn) (res-rest inn) (res-msg inn) (res-id inn) (res-used inn)
|
(make-res (res-a inn) (res-rest inn) (res-msg inn) (res-id inn) (res-used inn)
|
||||||
|
@ -460,34 +488,31 @@
|
||||||
(lambda (curr-ans rest-ans)
|
(lambda (curr-ans rest-ans)
|
||||||
(cond
|
(cond
|
||||||
[(repeat-res? rest-ans)
|
[(repeat-res? rest-ans)
|
||||||
(let ([a (res-a curr-ans)]
|
#;(printf "building up the repeat answer for ~a~n" repeat-name)
|
||||||
[rest (repeat-res-a rest-ans)])
|
(let* ([a (res-a curr-ans)]
|
||||||
#;(printf "building up the repeat answer for ~a~n" repeat-name)
|
[rest (repeat-res-a rest-ans)]
|
||||||
(make-repeat-res
|
[repeat-build
|
||||||
(cond
|
(lambda (r)
|
||||||
[(res? rest)
|
(cond
|
||||||
#;(printf "rest is a res for ~a~n" repeat-name)
|
[(res? r)
|
||||||
(make-res (append a (res-a rest)) (res-rest rest) repeat-name #f
|
#;(printf "rest is a res for ~a~n" repeat-name)
|
||||||
(+ (res-used curr-ans) (res-used rest))
|
(make-repeat-res
|
||||||
#f (res-first-tok curr-ans))]
|
(make-res (append a (res-a r)) (res-rest r) repeat-name #f
|
||||||
[(and (pair? rest) (null? (cdr rest)))
|
(+ (res-used curr-ans) (res-used r))
|
||||||
#;(printf "rest is a one-element list for ~a~n" repeat-name)
|
#f (res-first-tok curr-ans))
|
||||||
(make-res (append a (res-a (car rest)))
|
(repeat-res-stop rest-ans))]
|
||||||
(res-rest (car rest)) repeat-name #f
|
[else
|
||||||
(+ (res-used curr-ans) (res-used (car rest)))
|
(error 'parser-internal-error9 (format "~a" r))]))])
|
||||||
#f (res-first-tok curr-ans))]
|
(cond
|
||||||
[(pair? rest)
|
[(and (pair? rest) (null? (cdr rest)))
|
||||||
#;(printf "rest is a pair being sent off to correct-list for ~a~n" repeat-name)
|
#;(printf "rest is a one-element list for ~a~n" repeat-name)
|
||||||
(correct-list
|
(repeat-build (car rest))]
|
||||||
(map (lambda (rs)
|
[(pair? rest)
|
||||||
(make-res (append a (res-a rs)) (res-rest rs) repeat-name ""
|
(map repeat-build (flatten rest))]
|
||||||
(+ (res-used curr-ans) (res-used rs))
|
[else (repeat-build rest)]))]
|
||||||
#f (res-first-tok curr-ans)))
|
|
||||||
rest))])
|
|
||||||
(repeat-res-stop rest-ans)))]
|
|
||||||
[(pair? rest-ans)
|
[(pair? rest-ans)
|
||||||
(map (lambda (r) (process-rest curr-ans r)) rest-ans)]
|
(map (lambda (r) (process-rest curr-ans r)) (flatten rest-ans))]
|
||||||
[else (error 'here4)]))]
|
[else (error 'parser-internal-error10 (format "~a" rest-ans))]))]
|
||||||
[update-src
|
[update-src
|
||||||
(lambda (input prev-src)
|
(lambda (input prev-src)
|
||||||
(cond
|
(cond
|
||||||
|
@ -548,9 +573,9 @@
|
||||||
(loop (res-rest match)
|
(loop (res-rest match)
|
||||||
(update-src (res-rest match) curr-src))))
|
(update-src (res-rest match) curr-src))))
|
||||||
list-of-answer)]))]
|
list-of-answer)]))]
|
||||||
[else (error 'internal-parser-error8)]))]))])
|
[else (error 'internal-parser-error8 (format "~a" this-res))]))]))])
|
||||||
(hash-table-put! memo-table input ans)
|
(hash-table-put! memo-table input ans)
|
||||||
#;(!!! (printf "repeat of ~a ended with ans ~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
|
||||||
|
@ -597,8 +622,19 @@
|
||||||
[else (make-choice-res name corrects (fail-builder errors))])])
|
[else (make-choice-res name corrects (fail-builder errors))])])
|
||||||
#;(!!! (printf "choice ~a is returning options were ~a ~n" name choice-names))
|
#;(!!! (printf "choice ~a is returning options were ~a ~n" name choice-names))
|
||||||
#;(printf "corrects were ~a~n" corrects)
|
#;(printf "corrects were ~a~n" corrects)
|
||||||
|
#;(printf "errors were ~a~n" errors)
|
||||||
(hash-table-put! memo-table input ans) ans)])))))
|
(hash-table-put! memo-table input ans) ans)])))))
|
||||||
|
|
||||||
|
(define (flatten lst)
|
||||||
|
(cond
|
||||||
|
[(pair? lst)
|
||||||
|
(cond
|
||||||
|
[(pair? (car lst))
|
||||||
|
(append (flatten (car lst))
|
||||||
|
(flatten (cdr lst)))]
|
||||||
|
[else (cons (car lst) (flatten (cdr lst)))])]
|
||||||
|
[else null]))
|
||||||
|
|
||||||
;correct-list: (list result) -> (list result)
|
;correct-list: (list result) -> (list result)
|
||||||
(define (correct-list subs)
|
(define (correct-list subs)
|
||||||
(cond
|
(cond
|
||||||
|
@ -614,7 +650,7 @@
|
||||||
(append (car subs) (correct-list (cdr subs)))]
|
(append (car subs) (correct-list (cdr subs)))]
|
||||||
[else (correct-list (cdr subs))])]
|
[else (correct-list (cdr subs))])]
|
||||||
[(null? subs) null]
|
[(null? subs) null]
|
||||||
[else (error 'parser-internal-error6 subs)]))
|
[else (error 'parser-internal-error6 (format "~a" subs))]))
|
||||||
|
|
||||||
(define (split-list subs)
|
(define (split-list subs)
|
||||||
(let loop ([in subs] [correct null] [incorrect null])
|
(let loop ([in subs] [correct null] [incorrect null])
|
||||||
|
|
|
@ -470,9 +470,13 @@
|
||||||
(let ((member (car rest)))
|
(let ((member (car rest)))
|
||||||
(cond
|
(cond
|
||||||
((method? member)
|
((method? member)
|
||||||
(if (memq 'static (map modifier-kind (method-modifiers member)))
|
(cond
|
||||||
(check-method member static-env level type-recs c-class #t iface?)
|
[(memq 'static (map modifier-kind (method-modifiers member)))
|
||||||
(check-method member field-env level type-recs c-class #f iface?))
|
(check-method member static-env level type-recs c-class #t iface?)]
|
||||||
|
[(and (eq? level 'beginner) (eq? 'ctor (type-spec-name (method-type member))))
|
||||||
|
(check-method member fields level type-recs c-class #f iface?)]
|
||||||
|
[else
|
||||||
|
(check-method member field-env level type-recs c-class #f iface?)])
|
||||||
(loop (cdr rest) statics fields))
|
(loop (cdr rest) statics fields))
|
||||||
((initialize? member)
|
((initialize? member)
|
||||||
(if (initialize-static member)
|
(if (initialize-static member)
|
||||||
|
@ -505,7 +509,7 @@
|
||||||
(add-var-to-env name type (class-field (var-init? member)) statics)
|
(add-var-to-env name type (class-field (var-init? member)) statics)
|
||||||
(add-var-to-env name type (class-field (var-init? member)) fields))
|
(add-var-to-env name type (class-field (var-init? member)) fields))
|
||||||
(loop (cdr rest) statics
|
(loop (cdr rest) statics
|
||||||
(add-var-to-env name type (obj-field #f #;(var-init? member)) fields)))))
|
(add-var-to-env name type (obj-field (var-init? member)) fields)))))
|
||||||
((def? member)
|
((def? member)
|
||||||
(check-inner-def member level type-recs c-class field-env)
|
(check-inner-def member level type-recs c-class field-env)
|
||||||
(loop (cdr rest) statics fields))
|
(loop (cdr rest) statics fields))
|
||||||
|
@ -527,7 +531,7 @@
|
||||||
(lambda (assign)
|
(lambda (assign)
|
||||||
(field-set? field assign (car c-class) level #f)) assigns)))
|
(field-set? field assign (car c-class) level #f)) assigns)))
|
||||||
setting-fields))))
|
setting-fields))))
|
||||||
|
|
||||||
;create-field-env: (list field-record) env string -> env
|
;create-field-env: (list field-record) env string -> env
|
||||||
(define (create-field-env fields env class)
|
(define (create-field-env fields env class)
|
||||||
(cond
|
(cond
|
||||||
|
@ -543,9 +547,9 @@
|
||||||
(field-record-type field)
|
(field-record-type field)
|
||||||
(cond
|
(cond
|
||||||
((and in-env? (not current?)) inherited-conflict)
|
((and in-env? (not current?)) inherited-conflict)
|
||||||
((and (not static?) (not final?)) (obj-field #f))
|
((and (not static?) (not final?)) (obj-field #t))
|
||||||
((and (not static?) final?) (final-field current?))
|
((and (not static?) final?) (final-field current?))
|
||||||
((and static? (not final?)) (class-field #f))
|
((and static? (not final?)) (class-field #t))
|
||||||
((and static? final?) (final-class-field current?)))
|
((and static? final?) (final-class-field current?)))
|
||||||
(create-field-env (cdr fields) env class))))))
|
(create-field-env (cdr fields) env class))))))
|
||||||
|
|
||||||
|
|
|
@ -648,13 +648,13 @@
|
||||||
(sequence (O_PAREN (eta expression) C_PAREN) id "parened expression")
|
(sequence (O_PAREN (eta expression) C_PAREN) id "parened 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")
|
||||||
checks) "expression unique-base"))
|
checks) "expression"))
|
||||||
|
|
||||||
(define unique-end
|
(define unique-end
|
||||||
(choose (field-access-end
|
(choose (field-access-end
|
||||||
method-call-end
|
method-call-end
|
||||||
(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 unique-end"))
|
"expression"))
|
||||||
|
|
||||||
(define expression
|
(define expression
|
||||||
(sequence (unique-base (repeat-greedy unique-end)) id "expression"))
|
(sequence (unique-base (repeat-greedy unique-end)) id "expression"))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user