2016-10-22 47 views
1

我的詞法目前看起來像這樣的組合的標識符:球拍,我該如何設置一個詞法分析器來識別所有的數字和字母AZ和AZ

#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.1節是很好的,以及

回答

1

使用union看到更多。在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")) 
+0

謝謝,這就是我一直在尋找。唯一的另一件事是,我如何才能讓它只允許以字母開頭的標識符?現在,我認爲1aBc3XyZ8會起作用。 – user3760657

+0

否 - 現在不允許有數字。由於數字位於a-z範圍之外。 – soegaard

+0

我明白了。所以,如果我也想要數字,我可能會這樣做(union(char-range#\ a#\ z)(char-range#\ A#\ Z)(char-range#\ 0#\ 9))?在那種情況下,我將如何限制它僅作爲第一個字符的字母? – user3760657

相關問題