X-Git-Url: https://code.consxy.com/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fmain%2Flex.lisp;h=c7f082fc3d203f82e0e7d267c40236b77802980b;hb=d4ab3334d216c9963f9459d9e8870c6abafce8f1;hp=b1da84848d7792a5805f052e708d3efede778aa0;hpb=b398914bb75f7d9ac9b1d19076e98338281900b0;p=clnl diff --git a/src/main/lex.lisp b/src/main/lex.lisp index b1da848..c7f082f 100644 --- a/src/main/lex.lisp +++ b/src/main/lex.lisp @@ -1,7 +1,3 @@ -(defpackage #:cl-nl.lexer - (:use :common-lisp) - (:export :lex)) - (in-package #:cl-nl.lexer) ; I played around with using #'read for netlogo code, which would have been neat. @@ -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*))