[plt-scheme] help with parser-tools collection
I'm having some problems figuring out how to use the Parser-Tools
collection, and I'm hoping someone here can help me. The answer might
very well be quite simple, but I'm a newbie to Scheme, and I haven't
had much exposure to other parsers/lexers before either. I'm trying to
figure out how to match a case-insensitive string with the lexer.
Does anyone know how to do this?
More specifically, I'm trying to parse a named.conf file (the
configuration file for the Unix name server daemon "bind"). The data
I'm trying to parse looks like this:
zone "web-wide.net"{
type slave;
masters {
67.176.28.44;
};
file "web-wide.net";
};
And here's what I have so far as a lexer:
(require (lib "yacc.ss" "parser-tools")
(lib "lex.ss" "parser-tools")
(lib "readerr.ss" "syntax"))
(define-tokens value-tokens (STRING))
(define-empty-tokens stanza-tokens (newline ZONE OB CB EOF QUOTE))
(define-lex-abbrevs
(lower-letter (- "a" "z"))
(upper-letter (- #\A #\Z))
;; (- 0 9) would not work because the lexer does not understand
numbers. (- #\0 #\9) is ok too.
(digit (- "0" "9")))
(define zonel
(lexer
((eof) 'EOF)
(#\newline 'newline)
((: #\tab #\space) (zonel input-port))
("{" 'OB)
("}" 'CB)
("\"" 'QUOTE)
("zone" 'ZONE)
((+ (: lower-letter upper-letter)) (token-STRING (string->symbol
lexeme)))))
This will match the string "zone" in lowercase, but the named.conf file
is case-insensitive, so I need to also be able to match "ZONE", "zOne",
etc.
Does anyone have some guidance on how to go about doing this?