From 0250b445054766cef04b15cc05912272c0524ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Sun, 30 Oct 2022 05:58:46 -0300 Subject: Initial Commit This first revision has a working parser generator, with support for custom error reporting and handling of string and file inputs. --- input.lisp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 input.lisp (limited to 'input.lisp') diff --git a/input.lisp b/input.lisp new file mode 100644 index 0000000..d6dd4b3 --- /dev/null +++ b/input.lisp @@ -0,0 +1,40 @@ +(in-package #:input) + +(defstruct input + (cursor 0) + (file nil :read-only t) + (data nil :read-only t)) + +(defun has-data? (input) + (< (input-cursor input) + (length (input-data input)))) + +(defun element (input) + (char (input-data input) + (input-cursor input))) + +(defun advance (input) + (let ((new-input (copy-structure input))) + (incf (input-cursor new-input)) + new-input)) + +(declaim (ftype (function (simple-string) (values input &optional)) from-string)) +(defun from-string (str) + (make-input :data str)) + +(declaim (ftype (function (simple-string) (values input &optional)) from-file)) +(defun from-file (filename) + (make-input :file filename :data (str:read-file filename))) + +(defun generate-report (input message) + (let ((line 0) (column 0)) + (dotimes (i (input-cursor input)) + (let ((c (char (input-data input) i))) + (case c + (#\Newline + (incf line) + (setf column 1)) + (t (incf column))))) + (if (input-file input) + (format nil "~a:~a:~a: ~a" (input-file input) line column message) + (format nil "~a:~a: ~a" line column message)))) -- cgit v1.2.3