2012年5月30日水曜日

[Racket]字句解析

Racketのparser-toolsを使って字句解析をしてみます。
#lang racket
(require parser-tools/lex
  parser-tools/lex-sre)

(define-lex-abbrev newline
  (or (: #\return #\newline)
      (: #\newline)
      (: #\return)))

(define-lex-abbrev whitespace
  (+
   (or (: #\tab)
       (: #\space))))

(define-lex-abbrev section
  (: #\[
     (* (~ #\]))
     #\]))

(define-lex-abbrev =
  #\=)

(define-lex-abbrev id
  (+ (~ #\space #\tab #\newline #\return #\[ #\])))

(define l
  (lexer
   ;; skip
   [newline (l input-port)]
   ;; skip
   [whitespace (l input-port)]
   [section `(section . ,lexeme)]
   [= `(equal . "=")]
   [(eof) `(eof . null)]
   [id `(id . ,lexeme)]))


(define p (open-input-string "[section]\n key = value"))

(display (l p))
;=> (section . [section])
(display (l p))
;=> (id . key)
(display (l p))
;=> (equal . =)
(display (l p))
;=> (id . value)
(display (l p))
;=> (eof . null)

0 件のコメント:

コメントを投稿