2017-02-18 38 views
1

使用文件「測試lexer.lisp」,我已經很稍微修改試圖在包含文件中使用CL-詞法「{」和「}」

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

和增加次測試的重複數到6

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

,並試圖修改測試詞法分析器在多種方式,試圖使其接受「{」作爲標記。

例如,添加[:PUNCT:]在(deflexer測試詞法分析器...)

通過改變

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

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

和一致地得到錯誤等

「」「Lexer無法識別」{1.0 12 fred 10.23e12「,位置0(」{1.0 12 fred 10.2 3e「) [」簡單錯誤類型的條件「]」「」

如何指定「{」作爲要識別的字符?還是我的問題在其他地方?

回答

2

cl-lexer系統基於正則表達式,因此您可以將任何文字字符表示爲自身,如{。但是恰巧大括號字符在正則表達式語言中有特殊含義,所以您需要用反斜槓引用它。爲了在Lisp字符串中寫入反斜槓,反斜槓需要被轉義。因此:

(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:]+")) 

我返回:open-brace值和:grouping類別,但您可以選擇退貨的東西,如果你想別的。 然後測試功能返回:

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