使用文件" test-lexer.lisp",我对 lex 进行了略微修改
(defparameter *lex* (test-lexer "{ 1.0 12 fred 10.23e12"))
并将测试重复的次数增加到6
(defun test ()
(loop repeat 6
collect (multiple-value-list (funcall *lex*))))
并尝试通过多种方式修改测试 - 乘法器,以使其试图使其识别为" {"为令牌。
例如,添加[:punct:]在(deflexer test-lexer ...)
通过更改
("[:alpha:][:alnum:]*"
(return (values 'name %0)))
to
("[:alpha:][:alnum:][:punct:]*"
(return (values 'name %0)))
始终获得
之类的错误"" Lexer无法在" {1.0 12 FRED 10.23E12"中识别一个令牌,位置0(" {1.0 12 Fred 10.23e") [类型的简单错误]""
如何将" {"指定为要识别的角色?还是我在其他地方的问题?
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))