[plt-scheme] help with parser-tools collection
Thanks for the info, I really appreciate it.
I had thought about doing something like this, but it just seemed SO
kludgetastic that was I was sure there had to be another way.
Now that I know there *is* no other way... I'll kludge away
Thanks!
On Aug 6, 2004, at 3:59 PM, Scott Owens wrote:
> The lexer doesn't have built-in support for case-insensitivity.
> The best you can do is:
> (define-lex-abbrevs (z (: "Z" "z")) (o (: "O" "o")) (n (: "N" "n")) (e
> (: "E" "e")))
> (lexer
> ...
> ((@ z o n e) ...)
> ...)
>
> which is what I do in the Scheme lexer in
> collects/syntax-color/scheme-lexer.ss
>
> -Scott
>
>
>
> On Aug 6, 2004, at 3:44 PM, Bob McCormick wrote:
>
> > For list-related administrative tasks:
> > http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> >
> > 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?