better "expected more terms" messages in some cases
Still need docs, make constant stxclass descriptions available
This commit is contained in:
parent
a086943b7c
commit
c4ba293c7e
|
@ -461,11 +461,21 @@ Conventions:
|
||||||
[tx (cdr datum)]
|
[tx (cdr datum)]
|
||||||
[tpr (ps-add-cdr pr)])
|
[tpr (ps-add-cdr pr)])
|
||||||
(parse:matrix ((hx hcx hpr es) (tx tcx tpr es) . ins) inner))
|
(parse:matrix ((hx hcx hpr es) (tx tcx tpr es) . ins) inner))
|
||||||
(let ([es* (if (and 'proper? (null? datum)) (es-add-proper-pair es) es)])
|
(let ([es* (if (and 'proper? (null? datum))
|
||||||
|
(es-add-proper-pair (first-desc:matrix inner) es)
|
||||||
|
es)])
|
||||||
(fail (failure pr es*)))))]
|
(fail (failure pr es*)))))]
|
||||||
[(parse:pk (in1 . ins) #s(pk/and inner))
|
[(parse:pk (in1 . ins) #s(pk/and inner))
|
||||||
#'(parse:matrix (in1 in1 . ins) inner)]))
|
#'(parse:matrix (in1 in1 . ins) inner)]))
|
||||||
|
|
||||||
|
(define-syntax (first-desc:matrix stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(fdm (#s(pk (pat1 . pats) k)))
|
||||||
|
#'(first-desc:S pat1)]
|
||||||
|
[(fdm (pk ...))
|
||||||
|
;; FIXME
|
||||||
|
#'#f]))
|
||||||
|
|
||||||
;; ----
|
;; ----
|
||||||
|
|
||||||
;; (parse:S x cx S-pattern pr es k) : expr[Ans]
|
;; (parse:S x cx S-pattern pr es k) : expr[Ans]
|
||||||
|
@ -582,7 +592,7 @@ Conventions:
|
||||||
[tpr (ps-add-cdr pr)])
|
[tpr (ps-add-cdr pr)])
|
||||||
(parse:S hx hcx head hpr es
|
(parse:S hx hcx head hpr es
|
||||||
(parse:S tx cx tail tpr es k)))
|
(parse:S tx cx tail tpr es k)))
|
||||||
(let ([es* (if (and 'proper? (null? datum)) (es-add-proper-pair es) es)])
|
(let ([es* (if (and 'proper? (null? datum)) (es-add-proper-pair (first-desc:S head) es) es)])
|
||||||
(fail (failure pr es*)))))]
|
(fail (failure pr es*)))))]
|
||||||
[#s(pat:vector _attrs subpattern)
|
[#s(pat:vector _attrs subpattern)
|
||||||
#`(let ([datum (if (syntax? x) (syntax-e x) x)])
|
#`(let ([datum (if (syntax? x) (syntax-e x) x)])
|
||||||
|
@ -639,6 +649,33 @@ Conventions:
|
||||||
(let ([es* (es-add-thing pr 'description #t role es)])
|
(let ([es* (es-add-thing pr 'description #t role es)])
|
||||||
(fail (failure pr es*))))))])]))
|
(fail (failure pr es*))))))])]))
|
||||||
|
|
||||||
|
;; (first-desc:S S-pattern) : expr[FirstDesc]
|
||||||
|
(define-syntax (first-desc:S stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(fds p)
|
||||||
|
(syntax-case #'p ()
|
||||||
|
[#s(pat:any _as)
|
||||||
|
#''(any)]
|
||||||
|
[#s(pat:var _as name #f _ () _ _ _)
|
||||||
|
#''(any)]
|
||||||
|
[#s(pat:var _ ...)
|
||||||
|
#'#f] ;; FIXME: need access to (constant) description as field
|
||||||
|
[#s(pat:datum _as d)
|
||||||
|
#''(datum d)]
|
||||||
|
[#s(pat:literal _as id _ip _lp)
|
||||||
|
#''(literal id)]
|
||||||
|
[#s(pat:describe _as _p description _t? _role)
|
||||||
|
#'description] ;; FIXME??? only constants?
|
||||||
|
[#s(pat:delimit _a pattern)
|
||||||
|
#'(first-desc:S pattern)]
|
||||||
|
[#s(pat:commit _a pattern)
|
||||||
|
#'(first-desc:S pattern)]
|
||||||
|
[#s(pat:post _a pattern)
|
||||||
|
#'(first-desc:S pattern)]
|
||||||
|
[#s(pat:integrated _as _name _pred description _role)
|
||||||
|
#''description]
|
||||||
|
[_ #'#f])]))
|
||||||
|
|
||||||
;; (disjunct ???-pattern success (pre:expr ...) (id:id ...)) : expr[Ans]
|
;; (disjunct ???-pattern success (pre:expr ...) (id:id ...)) : expr[Ans]
|
||||||
(define-syntax (disjunct stx)
|
(define-syntax (disjunct stx)
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
|
|
|
@ -145,7 +145,7 @@ An ExpectStack (during parsing) is one of
|
||||||
* (make-expect:message string ExpectStack)
|
* (make-expect:message string ExpectStack)
|
||||||
* (make-expect:atom atom ExpectStack)
|
* (make-expect:atom atom ExpectStack)
|
||||||
* (make-expect:literal identifier ExpectStack)
|
* (make-expect:literal identifier ExpectStack)
|
||||||
* (make-expect:proper-pair ExpectStack)
|
* (make-expect:proper-pair FirstDesc ExpectStack)
|
||||||
|
|
||||||
The *-marked variants can only occur at the top of the stack.
|
The *-marked variants can only occur at the top of the stack.
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ An Expect is one of
|
||||||
* (expect:message string _)
|
* (expect:message string _)
|
||||||
* (expect:atom atom _)
|
* (expect:atom atom _)
|
||||||
* (expect:literal identifier _)
|
* (expect:literal identifier _)
|
||||||
* (expect:proper-pair _)
|
* (expect:proper-pair string/#f _)
|
||||||
- (expect:disj (non-empty-listof Expect) _)
|
- (expect:disj (non-empty-listof Expect) _)
|
||||||
|
|
||||||
That is, next link always ignored (replace with #f for sake of equal? cmp)
|
That is, next link always ignored (replace with #f for sake of equal? cmp)
|
||||||
|
@ -172,7 +172,7 @@ Goal during reporting is ease of manipulation.
|
||||||
(struct expect:atom (atom next) #:prefab)
|
(struct expect:atom (atom next) #:prefab)
|
||||||
(struct expect:literal (literal next) #:prefab)
|
(struct expect:literal (literal next) #:prefab)
|
||||||
(struct expect:disj (expects next) #:prefab)
|
(struct expect:disj (expects next) #:prefab)
|
||||||
(struct expect:proper-pair (next) #:prefab)
|
(struct expect:proper-pair (first-desc next) #:prefab)
|
||||||
|
|
||||||
(define (expect? x)
|
(define (expect? x)
|
||||||
(or (expect:thing? x)
|
(or (expect:thing? x)
|
||||||
|
@ -198,5 +198,14 @@ Goal during reporting is ease of manipulation.
|
||||||
(define (es-add-literal literal next)
|
(define (es-add-literal literal next)
|
||||||
(expect:literal literal next))
|
(expect:literal literal next))
|
||||||
|
|
||||||
(define (es-add-proper-pair next)
|
(define (es-add-proper-pair first-desc next)
|
||||||
(expect:proper-pair next))
|
(expect:proper-pair first-desc next))
|
||||||
|
|
||||||
|
#|
|
||||||
|
A FirstDesc is one of
|
||||||
|
- #f -- unknown, multiple possible, etc
|
||||||
|
- string -- description
|
||||||
|
- (list 'any)
|
||||||
|
- (list 'literal symbol)
|
||||||
|
- (list 'datum datum)
|
||||||
|
|#
|
||||||
|
|
|
@ -122,8 +122,15 @@ complicated.
|
||||||
(format "expected the identifier `~s'" (syntax-e literal))]
|
(format "expected the identifier `~s'" (syntax-e literal))]
|
||||||
[(expect:message message _)
|
[(expect:message message _)
|
||||||
(format "~a" message)]
|
(format "~a" message)]
|
||||||
[(expect:proper-pair _)
|
[(expect:proper-pair '#f _)
|
||||||
"expected more terms"]))
|
"expected more terms"]
|
||||||
|
[(expect:proper-pair first-desc _)
|
||||||
|
(format "expected more terms starting with ~a"
|
||||||
|
(match first-desc
|
||||||
|
[(? string?) first-desc]
|
||||||
|
[(list 'any) "any term"]
|
||||||
|
[(list 'literal id) (format "the literal symbol `~s'" id)]
|
||||||
|
[(list 'datum d) (format "the literal ~s" d)]))]))
|
||||||
|
|
||||||
(define (context-prose-for-expect e)
|
(define (context-prose-for-expect e)
|
||||||
(match e
|
(match e
|
||||||
|
@ -208,8 +215,8 @@ complicated.
|
||||||
(cons (expect:atom atom #f) (loop rest-es))]
|
(cons (expect:atom atom #f) (loop rest-es))]
|
||||||
[(expect:literal literal rest-es)
|
[(expect:literal literal rest-es)
|
||||||
(cons (expect:literal literal #f) (loop rest-es))]
|
(cons (expect:literal literal #f) (loop rest-es))]
|
||||||
[(expect:proper-pair rest-es)
|
[(expect:proper-pair first-desc rest-es)
|
||||||
(cons (expect:proper-pair #f) (loop rest-es))]))))
|
(cons (expect:proper-pair first-desc #f) (loop rest-es))]))))
|
||||||
|
|
||||||
#|
|
#|
|
||||||
Simplification dilemma
|
Simplification dilemma
|
||||||
|
|
Loading…
Reference in New Issue
Block a user