在Racket中,如何设置词法分析器以识别带有所有数字和字母A-Z和a-z组合的标识符

时间:2016-10-22 16:09:46

标签: string racket lexer

我的词霸目前看起来像这样:

#lang racket
(require parser-tools/lex)

(define testLexer
  (lexer
    ["foo" (list 'FOO lexeme)]
    ["bar" (list 'BAR lexeme)]
    [(repetition 1 +inf.0 (char-range #\a #\z)) (list 'ID lexeme)]
    [whitespace (testLexer input-port)]))

'ID符号适用于小写字母和数字的所有组合。 我希望它也可以使用大写字母。我试过了:

[(repetition 1 +inf.0 (char-range #\a #\z) (char-range #\A #\Z) (list 'ID lexeme)]

但由于重复只需要两个参数,我不能放入第三个参数。

必须有一些简单的方法来包含大写字母。

编辑:另外,如果有某种方法可以确保标识符以字母(不是数字)开头,那么这也很好

1 个答案:

答案 0 :(得分:1)

使用union在1.1节中查看更多内容。在lexer documentataion

#lang racket
(require parser-tools/lex)

(define testLexer
  (lexer
    ["foo"                (list 'FOO lexeme)]
    ["bar"                (list 'BAR lexeme)]
    [(repetition 1 +inf.0 (union (char-range #\a #\z) (char-range #\A #\Z))) (list 'ID lexeme)]
    [whitespace           (testLexer input-port)]))

(testLexer (open-input-string "AbCDe"))