Common lisp 试图在包含“0”的文件上使用cl lexer;{“和”};

Common lisp 试图在包含“0”的文件上使用cl lexer;{“和”};,common-lisp,lexer,character-class,Common Lisp,Lexer,Character Class,使用文件“test lexer.lisp”,我对lex进行了非常细微的修改 并将测试重复次数增加到6次 (defun test () (loop repeat 6 collect (multiple-value-list (funcall *lex*)))) 并尝试以多种方式修改测试lexer,试图让它将“{”识别为令牌 例如,在(偏转器测试偏转器…)中添加[:punct:] 通过改变 ("[:alpha:][:alnum:]*" (return (values 'name %0))

使用文件“test lexer.lisp”,我对lex进行了非常细微的修改

并将测试重复次数增加到6次

(defun test ()
  (loop repeat 6
 collect (multiple-value-list (funcall *lex*))))
并尝试以多种方式修改测试lexer,试图让它将“{”识别为令牌

例如,在(偏转器测试偏转器…)中添加[:punct:]

通过改变

("[:alpha:][:alnum:]*"
  (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:]+"))
("[:alpha:][:alnum:][:punct:]*"
   (return (values 'name %0)))
(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:]+"))
((:GROUPING :OPEN-BRACE) (FLT 1.0) (INT 12)
 (NAME "fred") (FLT 1.023e13) (NIL NIL))