2017-02-18 6 views
1

, 나는 아주 약간포함하는 파일에 CL-렉서를 사용하려고 "{"와 "}는"파일 "테스트 lexer.lisp"를 사용

(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 ") [SIMPLE-ERROR 유형의 조건]" ""

"{"를 인식 할 문자로 지정할 수 있습니까? 아니면 다른 곳에서 내 문제입니까?

답변

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))