repair parser & parser tests

pull/2/head
Matthew Butterick 8 years ago
parent f57653c43d
commit e435574b9f

@ -90,34 +90,34 @@
#f) #f)
$2))] $2))]
;; bang indicates hiding. set hide value to "hide" [(RULE_HEAD_HIDDEN pattern) ; bang indicates hiding
[(RULE_HEAD_HIDDEN pattern)
(begin (begin
(define trimmed (cadr (regexp-match #px"!(\\S+)\\s*:$" $1))) (define trimmed (cadr (regexp-match #px"!(\\S+)\\s*:$" $1)))
(rule (position->pos $1-start-pos) (rule (position->pos $1-start-pos)
(position->pos $2-end-pos) (position->pos $2-end-pos)
(lhs-id (position->pos $1-start-pos) (lhs-id (position->pos $1-start-pos)
(pos (+ (position-offset $1-start-pos) (pos (+ (position-offset $1-start-pos)
(string-length trimmed)) (string-length trimmed)
(string-length "!"))
(position-line $1-start-pos) (position-line $1-start-pos)
(position-col $1-start-pos)) (position-col $1-start-pos))
trimmed trimmed
''hide) ; symbols won't work for these signals ''hide) ; symbol needs to be double quoted in this case
$2))] $2))]
;; atsign indicates splicing. set hide value to "splice" [(RULE_HEAD_SPLICED pattern) ;atsign indicates splicinh
[(RULE_HEAD_SPLICED pattern)
(begin (begin
(define trimmed (cadr (regexp-match #px"@(\\S+)\\s*:$" $1))) (define trimmed (cadr (regexp-match #px"@(\\S+)\\s*:$" $1)))
(rule (position->pos $1-start-pos) (rule (position->pos $1-start-pos)
(position->pos $2-end-pos) (position->pos $2-end-pos)
(lhs-id (position->pos $1-start-pos) (lhs-id (position->pos $1-start-pos)
(pos (+ (position-offset $1-start-pos) (pos (+ (position-offset $1-start-pos)
(string-length trimmed)) (string-length trimmed)
(string-length "@"))
(position-line $1-start-pos) (position-line $1-start-pos)
(position-col $1-start-pos)) (position-col $1-start-pos))
trimmed trimmed
''splice) ''splice) ; symbol needs to be double quoted in this case
$2))]] $2))]]
[pattern [pattern
@ -194,7 +194,7 @@
;; only works for nonterminals on the right side (meaningless with terminals) ;; only works for nonterminals on the right side (meaningless with terminals)
(if (token-id? $2) (if (token-id? $2)
(error 'brag "Can't use splice operator with terminal") (error 'brag "Can't use splice operator with terminal")
(pattern-id (position->pos $2-start-pos) (pattern-id (position->pos $1-start-pos)
(position->pos $2-end-pos) (position->pos $2-end-pos)
$2 $2
'splice))]]) 'splice))]])

@ -25,13 +25,39 @@
(lhs-id (p 1) (p 5) "expr" #f) (lhs-id (p 1) (p 5) "expr" #f)
(pattern-token (p 8) (p 13) "COLON" #f)))) (pattern-token (p 8) (p 13) "COLON" #f))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : <COLON> COLON"))) (check-equal? (grammar-parser (tokenize (open-input-string "!expr : COLON")))
(list (rule (p 1) (p 21) (list (rule (p 1) (p 14)
(lhs-id (p 1) (p 6) "expr" ''hide)
(pattern-token (p 9) (p 14) "COLON" #f))))
(check-equal? (grammar-parser (tokenize (open-input-string "@expr : COLON")))
(list (rule (p 1) (p 14)
(lhs-id (p 1) (p 6) "expr" ''splice)
(pattern-token (p 9) (p 14) "COLON" #f))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : !COLON COLON")))
(list (rule (p 1) (p 20)
(lhs-id (p 1) (p 5) "expr" #f)
(pattern-seq (p 8) (p 20)
(list
(pattern-token (p 8) (p 14) "COLON" 'hide)
(pattern-token (p 15) (p 20) "COLON" #f))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : !thing COLON")))
(list (rule (p 1) (p 20)
(lhs-id (p 1) (p 5) "expr" #f)
(pattern-seq (p 8) (p 20)
(list
(pattern-id (p 8) (p 14) "thing" 'hide)
(pattern-token (p 15) (p 20) "COLON" #f))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : @thing COLON")))
(list (rule (p 1) (p 20)
(lhs-id (p 1) (p 5) "expr" #f) (lhs-id (p 1) (p 5) "expr" #f)
(pattern-seq (p 8) (p 21) (pattern-seq (p 8) (p 20)
(list (list
(pattern-token (p 8) (p 15) "COLON" #t) (pattern-id (p 8) (p 14) "thing" 'splice)
(pattern-token (p 16) (p 21) "COLON" #f)))))) (pattern-token (p 15) (p 20) "COLON" #f))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : 'hello'*"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : 'hello'*")))
(list (rule (p 1) (p 16) (list (rule (p 1) (p 16)
@ -47,11 +73,11 @@
1 1
(pattern-lit (p 8) (p 15) "hello" #f))))) (pattern-lit (p 8) (p 15) "hello" #f)))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : [<'hello'>]"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : [!'hello']")))
(list (rule (p 1) (p 19) (list (rule (p 1) (p 18)
(lhs-id (p 1) (p 5) "expr" #f) (lhs-id (p 1) (p 5) "expr" #f)
(pattern-maybe (p 8) (p 19) (pattern-maybe (p 8) (p 18)
(pattern-lit (p 9) (p 18) "hello" #t))))) (pattern-lit (p 9) (p 17) "hello" 'hide)))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : COLON | BLAH"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : COLON | BLAH")))
(list (rule (p 1) (p 20) (list (rule (p 1) (p 20)
@ -70,13 +96,12 @@
(list (pattern-token (p 23) (p 26) "BAZ" #f) (list (pattern-token (p 23) (p 26) "BAZ" #f)
(pattern-id (p 27) (p 31) "expr" #f)))))))) (pattern-id (p 27) (p 31) "expr" #f))))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : one two <three>"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : one two !three")))
(list (rule (p 1) (p 23) (list (rule (p 1) (p 22)
(lhs-id (p 1) (p 5) "expr" #f) (lhs-id (p 1) (p 5) "expr" #f)
(pattern-seq (p 8) (p 23) (list (pattern-id (p 8) (p 11) "one" #f) (pattern-seq (p 8) (p 22) (list (pattern-id (p 8) (p 11) "one" #f)
(pattern-id (p 12) (p 15) "two" #f) (pattern-id (p 12) (p 15) "two" #f)
(pattern-id (p 16) (p 23) "three" #t)))))) (pattern-id (p 16) (p 22) "three" 'hide))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : (one two three)"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : (one two three)")))
(list (rule (p 1) (p 23) (list (rule (p 1) (p 23)
@ -85,7 +110,6 @@
(pattern-id (p 13) (p 16) "two" #f) (pattern-id (p 13) (p 16) "two" #f)
(pattern-id (p 17) (p 22) "three" #f)))))) (pattern-id (p 17) (p 22) "three" #f))))))
(check-equal? (grammar-parser (tokenize (open-input-string "expr : one two* three"))) (check-equal? (grammar-parser (tokenize (open-input-string "expr : one two* three")))
(list (rule (p 1) (p 22) (list (rule (p 1) (p 22)
(lhs-id (p 1) (p 5) "expr" #f) (lhs-id (p 1) (p 5) "expr" #f)

Loading…
Cancel
Save