X-Git-Url: https://code.consxy.com/gitweb/gitweb.cgi?p=clnl;a=blobdiff_plain;f=src%2Fmain%2Flex.lisp;h=780aec2aeefd1af4d3b6c490661c3053c590525e;hp=b1da84848d7792a5805f052e708d3efede778aa0;hb=c34fdd7f3b9920b2feaf1dec70d2dd21ddbbadf2;hpb=b398914bb75f7d9ac9b1d19076e98338281900b0 diff --git a/src/main/lex.lisp b/src/main/lex.lisp index b1da848..780aec2 100644 --- a/src/main/lex.lisp +++ b/src/main/lex.lisp @@ -1,8 +1,4 @@ -(defpackage #:cl-nl.lexer - (:use :common-lisp) - (:export :lex)) - -(in-package #:cl-nl.lexer) +(in-package #:clnl-lexer) ; I played around with using #'read for netlogo code, which would have been neat. ; However, it provides too many instances where people could inject CL code @@ -37,10 +33,10 @@ (defun lex (text) (if (string= "" text) (let - ((lex (find-if (lambda (f) (funcall f *state* :eof)) *lexes* :key #'car))) + ((lex (find-if (lambda (f) (funcall f *state* :eof)) *lexes* :from-end t :key #'car))) (when lex (list (funcall (third lex) :eof)))) (let - ((lex (find-if (lambda (f) (funcall f *state* text)) *lexes* :key #'car))) + ((lex (find-if (lambda (f) (funcall f *state* text)) *lexes* :from-end t :key #'car))) (when (not lex) (error "Can't lex this: ~S" text)) (let ((val (funcall (third lex) (subseq text 0 (funcall (cadr lex) text))))) @@ -58,7 +54,7 @@ (defvar *letter* "\\w") (defvar *digit* "\\d") ;(defparameter *identifier-char* "[\\w\\d_\\.?=\*!<>:#\+/%\$\^\'&-]") -(defvar *identifier-char* "[\\w\\d]") +(defvar *identifier-char* "[\\w\\d-.]") ;(defvar *extension-literal-depth* 0) ;(defstruct extension-literal text) @@ -86,15 +82,15 @@ (deflex :initial *nonnewline_white_space_char* (constantly nil)) (deflex :initial "\\n|\\r" (constantly nil)) ;(deflex :initial ";.*[\n\r]?" nil) -;(deflex :initial (format nil "-?\.?[0-9]~A" *identifier-char*) -; (lambda (text) -; (let -; ((num? -; (let -; ((*readtable* (copy-readtable nil)) -; (*read-eval* nil)) -; (read-from-string text)))) -; (if (numberp num?) num? (error "Invalid number"))))) +(deflex :initial (format nil "-?\.?[0-9]~A*" *identifier-char*) + (lambda (text) + (let + ((num? + (let + ((*readtable* (copy-readtable nil)) + (*read-eval* nil)) + (read-from-string text)))) + (if (numberp num?) num? (error "Invalid number"))))) (deflex :initial (format nil "~A*" *identifier-char*) #'as-symbol) ;(deflex :initial (format nil "\"~A*\"" *string-text*))