2017-02-18 3 views
1

Mit Hilfe der Datei "Test-lexer.lisp", ich habe sehr leicht modifizierte lexversucht, cl-Lexer auf eine Datei zu verwenden, die "{" und "}"

(defparameter *lex* (test-lexer "{ 1.0 12 fred 10.23e12")) 

und erhöht zu sein die Anzahl des Tests wiederholt bis 6

(defun test() 
    (loop repeat 6 
collect (multiple-value-list (funcall *lex*)))) 

und versuchte Test-Lexer in einer Reihe von Möglichkeiten, zu modifizieren, um zu versuchen, es zu bekommen zu erkennen, „{“ als ein Zeichen.

Zum Beispiel das Hinzufügen [: punct:] in (deflexer Test-Lexer ...)

durch Änderung

("[:alpha:][:alnum:]*" 
    (return (values 'name %0))) 

zu

("[:alpha:][:alnum:][:punct:]*" 
    (return (values 'name %0))) 

und konsequent Fehler erhalten wie

"" "Lexer kann ein Token in" {1.0 12 fred 10.23e12 ", Position 0 (" {1.0 12 fred 10.2 3e ") [Bedingung des Typs SIMPLE-ERROR]" ""

Wie kann ich "{" als zu erkennendes Zeichen angeben? Oder ist mein Problem anderswo?

Antwort

2

Das CL-Lexer System basiert auf regulären Ausdrücken, so dass Sie jedes Literalzeichen für sich selbst stehen lassen können, wie {. Es kommt jedoch vor, dass das geschweifte Klammerzeichen in der Sprache des regulären Ausdrucks eine besondere Bedeutung hat, weshalb Sie es mit einem umgekehrten Schrägstrich angeben müssen. Um einen Backslash in Lisp-Strings zu schreiben, müssen Backslashes maskiert werden. Daraus folgt:

(deflexer test-lexer 
    ("\\{" (return (values :grouping :open-brace))) ;; <-- Here 
    ("[0-9]+([.][0-9]+([Ee][0-9]+)?)" 
    (return (values 'flt (num %0)))) 
    ("[0-9]+" 
    (return (values 'int (int %0)))) 
    ("[:alpha:][:alnum:]*" 
    (return (values 'name %0))) 
    ("[:space:]+")) 

kehre ich den :open-brace Wert und die :grouping Kategorie, aber Sie können wählen, etwas anderes zurück, wenn Sie wollen. Die Testfunktion gibt dann zurück:

((:GROUPING :OPEN-BRACE) (FLT 1.0) (INT 12) 
(NAME "fred") (FLT 1.023e13) (NIL NIL)) 
Verwandte Themen