Skip to content

Commit

Permalink
Add radix not natural number parser and make backtracking one actuall…
Browse files Browse the repository at this point in the history
…y backtracking.
  • Loading branch information
Ramarren committed Jan 25, 2011
1 parent 8dfc8fd commit 90ae404
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 8 deletions.
9 changes: 3 additions & 6 deletions greedy.lisp
Expand Up @@ -112,13 +112,10 @@ non-recursively and has better memory performance."
:tree init-x :suffix inp))))))
(bind p #'rest-chain))))

(defun nat* ()
(defun nat* (&optional (radix 10))
"Non-backtracking parser: accept natural number, consuming as many digits as possible"
(chainl1* (named-seq* (<- x (digit?))
(digit-char-p x))
(result
#'(lambda (x y)
(+ (* 10 x) y)))))
(named-seq* (<- number (gather-if* (rcurry #'digit-char-p radix) :result-type 'string))
(parse-integer number :radix radix)))

(defun int* ()
"Non-backtracking parser: accept integer, consuming as many digits as possible"
Expand Down
4 changes: 4 additions & 0 deletions test-parsers.lisp
Expand Up @@ -97,6 +97,10 @@
("1" 1 "23" 23)
("-1"))

(defparsertest test-nat?2 (seq-list? (nat?) "15")
("1015" '(10 "15"))
())

(defparsertest test-chainl1? (chainl1? (digit?) (result #'list))
("123" (list (list #\1 #\2) #\3))
(""))
Expand Down
6 changes: 4 additions & 2 deletions token-parsers.lisp
Expand Up @@ -43,8 +43,10 @@

(def-cached-arg-parser nat? (&optional (radix 10))
"Parser: accept natural numbers"
(named-seq* (<- number (gather-if* #'digit-char-p :result-type 'string))
(parse-integer number)))
(named-seq? (<- number (between? (sat (rcurry #'digit-char-p radix))
1 nil
'string))
(parse-integer number :radix radix)))

(def-cached-arg-parser int? (&optional (radix 10))
"Parser: accept an integer, return as integer."
Expand Down

0 comments on commit 90ae404

Please sign in to comment.