Skip to content

Commit

Permalink
parser provides source ranges within actions
Browse files Browse the repository at this point in the history
  • Loading branch information
Ian Piumarta committed Jun 13, 2012
1 parent 8be7da5 commit 4b1def6
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 14 deletions.
12 changes: 9 additions & 3 deletions parser.l
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
(define-function input-stream (source path)
(let ((self (new <input-stream>)))
(set (<input-stream>-source self) source)
(set (<input-stream>-srcpos self) (cons path 0))
(set (<input-stream>-srcpos self) (cons path 1))
self))

(define-method $at-end <input-stream> ()
Expand Down Expand Up @@ -667,7 +667,7 @@

;;;----------------------------------------------------------------

(define-structure <parser> (source result))
(define-structure <parser> (source result position))

(define-function parser (type stream)
(let ((self (new type)))
Expand Down Expand Up @@ -764,9 +764,15 @@
(define *active* '(*active*))
(define *recurred* '(*recurred*))

(define-function peg-source-range-begin (self) (push (<parser>-position self) ($source-position (<parser>-source self))))
(define-function peg-source-range-end (self) (pop (<parser>-position self)))

(define-function peg-invoke-rule-simply (rule name self)
;;(println "; simple "name)
(rule self))
(peg-source-range-begin self)
(let ((result (rule self)))
(peg-source-range-end self)
result))

(define-function peg-invoke-rule-with-memo (rule name self)
;;(println "; memoised "name" "self)
Expand Down
6 changes: 3 additions & 3 deletions peg-compile.l
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(define-function peg-invoke-rule (rule name parser)
(rule parser))
;(define-function peg-invoke-rule (rule name parser)
; (rule parser))

(define-form match-save (exp) `(let ((pos (<parser-stream>-position self.source))) ,exp))
(define-form match-ok () `(set (<parser-stream>-position self.source) pos))
Expand Down Expand Up @@ -100,7 +100,7 @@
(define-form make-number (base exp) `(and ,exp (set self.result (string->number-base (list->string self.result) ,base))))

(define-form assign-result (name exp) `(let ((_s ,exp)) (and _s (let () (set ,name self.result) _s))))
(define-form result-expr (exp) `(let () (set self.result ,exp) 1))
(define-form result-expr (exp) `(let () (peg-source-range-begin self) (set self.result ,exp) (peg-source-range-end self) 1))

(define-function peg-find-variables (tree vars)
(and (pair? tree)
Expand Down
4 changes: 2 additions & 2 deletions peg.g
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ value =
| 'make-symbol value:exp -> `(and ,exp (set self.result (string->symbol (list->string self.result))))
| 'make-number .:r value:exp -> `(and ,exp (set self.result (string->number-base (list->string self.result) ,r)))
| 'assign-result .:name value:exp -> `(and ,exp (let () (set ,name self.result) 1))
| 'result-expr .:exp -> `(let () (set self.result ,exp) 1)
| 'result-expr .:exp -> `(let () (peg-source-range-begin self) (set self.result ,exp) (peg-source-range-end self) 1)
| .:op -> (error "cannot generate value for "op)
| -> (error "cannot generate value for nil")
) ;
Expand Down Expand Up @@ -259,7 +259,7 @@ effect =
| 'make-symbol effect:exp -> exp
| 'make-number .:r effect:exp -> exp
| 'assign-result .:name value:exp -> `(and ,exp (let () (set ,name self.result) 1))
| 'result-expr .:exp -> `(let () ,exp 1)
| 'result-expr .:exp -> `(let () (peg-source-range-begin self) ,exp (peg-source-range-end self) 1)
| .:op -> (error "cannot generate value for "op)
| -> (error "cannot generate value for nil")
) ;
10 changes: 5 additions & 5 deletions peg.l

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion test-repl.l
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,9 @@ foo * bar

paramlist = "(" _ name?:a ("," _ name)*:b ")" _ -> `(,@a ,@b) ;

fundefn = name:f paramlist:a "=" _ expression:e -> (let ()
fundefn = name:f paramlist:a "=" _ expression:e -> (println "FUNCTION DEFINITION FROM "(cadr (<parser>-position self))
" TO " (car (<parser>-position self)))
-> (let ()
(eval (list 'define f))
`(set ,f (lambda ,a ,e))) ;

Expand Down

0 comments on commit 4b1def6

Please sign in to comment.