blob: 100baa5cedf1e1111d9702615479da1d14cdaf27 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
(in-package #:monparser)
(defclass parser-input ()
((cursor :initarg :cursor :accessor input-cursor :initform 0)
(data :initarg :data :reader input-data :initform nil)))
(defun has-data? (input)
(< (input-cursor input) (length (input-data input))))
(defun peek (input)
(char (input-data input)
(input-cursor input)))
(defun advance (input)
(make-instance 'parser-input
:data (input-data input)
:cursor (+ (input-cursor input) 1)))
(defun cursor-distance (input1 input2)
(- (input-cursor input1) (input-cursor input2)))
(defun line-and-column (input)
(let ((line 1) (column 1))
(dotimes (i (input-cursor input))
(let ((c (char (input-data input) i)))
(case c
(#\Newline
(incf line)
(setf column 1))
(t (incf column)))))
(values line column)))
|