2017-02-18 41 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))