2017-02-18 4 views
1

は、私は非常にわずか含むファイルにCL-レクサーを使用しようと、「{」および「}」はファイル「テストlexer.lisp」を用い

(defparameter *lex* (test-lexer "{ 1.0 12 fred 10.23e12")) 

あることがLEXを修正した増加します回試験繰り返し数6

(defun test() 
    (loop repeat 6 
collect (multiple-value-list (funcall *lex*)))) 

に、それがトークンとして「{」を認識するために取得しようとするいくつかの方法でテストレクサーを修正しようとしました。例えば

、追加[する:PUNCT:]

("[:alpha:][:alnum:][:punct:]*" 
    (return (values 'name %0))) 

("[:alpha:][:alnum:]*" 
    (return (values 'name %0))) 

を変化させることにより

(deflexer試験-レクサー...)に、一貫

ようなエラーが出

"" "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)) 
関連する問題