-
Notifications
You must be signed in to change notification settings - Fork 3
/
nilbot-parser.lisp
63 lines (56 loc) · 1.92 KB
/
nilbot-parser.lisp
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
;; -*- Lisp -*-
;; nilbot-parser.lisp --
;;
;; Copyright (C) 2009,2011,2012 David Vazquez
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;
(in-package :nilbot)
(defun whitespace-char-p (ch)
(or (char= ch #\space)
(char= ch #\tab)))
(defun skip-whitespace (stream)
(read-until stream (complement #'whitespace-char-p) :eof-error-p nil)
(values))
(defun parse-argument (stream)
(skip-whitespace stream)
(let ((ch (peek-char nil stream nil)))
(cond
;; No argument
((null ch)
nil)
;; Integer
((digit-char-p ch)
(let ((string (read-until stream #'whitespace-char-p :eof-error-p nil)))
(parse-integer string)))
;; Quote string
((char= ch #\')
(prog2 (read-char stream)
(read-until stream #\')
(read-char stream)))
;; Double quote string
((char= ch #\")
(prog2 (read-char stream)
(read-until stream #\")
(read-char stream)))
(t
;; Simple string
(read-until stream #'whitespace-char-p :eof-error-p nil)))))
(defun parse-arguments (stream)
(loop for arg = (parse-argument stream)
while arg
collect arg))
(defun parse-command (stream)
(read-until stream #'whitespace-char-p :eof-error-p nil))
;; nilbot-parser.lisp ends here