Common lisp 试图在包含“0”的文件上使用cl lexer;{“和”};
使用文件“test lexer.lisp”,我对lex进行了非常细微的修改 并将测试重复次数增加到6次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))
(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))