尝试在包含"{"和"}"的文件上使用CL-Lexer



使用文件" 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))

相关内容

  • 没有找到相关文章

最新更新