27 lines
No EOL
1.2 KiB
Racket
27 lines
No EOL
1.2 KiB
Racket
#lang br
|
|
(require brag/support)
|
|
|
|
(define-lex-abbrev digits (:+ (char-set "0123456789")))
|
|
(define-lex-abbrev raw-id (:: (:or "_" (:/ "a" "z") (:/ "A" "Z")) (:* (:or "_" (:/ "0" "9") (:/ "a" "z") (:/ "A" "Z")))))
|
|
(define-lex-abbrev any-other-char (:~ (char-set "0123456789@\\{}%|")))
|
|
|
|
(define uahgi2-lexer
|
|
(lexer-srcloc
|
|
[(:or "\r\n" "\n") (token 'NEWLINE lexeme)] ; newline
|
|
[whitespace (token lexeme lexeme)] ; whitespace
|
|
[(:: "\\"(char-set "@\\{}%|")) (token 'CHAR (substring lexeme
|
|
1 (string-length lexeme)))]
|
|
[(:: "@" raw-id) (token 'ID (substring lexeme
|
|
1 (string-length lexeme)))] ; @id
|
|
["{" (token 'L_PAREN lexeme)] ; {
|
|
["}" (token 'R_PAREN lexeme)] ; }
|
|
["|" (token 'SEPERATOR lexeme)] ; | (general) seperator
|
|
["@@" (token 'G_SEPERATOR lexeme)] ; @@ great seperator
|
|
["`" (token 'NUM_CONVERTER lexeme)] ; ` convert to number
|
|
[digits (token 'INTEGER (string->number lexeme))] ;123
|
|
[(:: (:? (char-set "-")) digits "." digits) ; 123.456
|
|
(token 'DECIMAL (string->number lexeme))]
|
|
[ (from/to "%" "%") ; %COMMENT%
|
|
(token 'COMMENT #:skip? #t)]
|
|
[any-other-char (token 'CHAR lexeme)])) ; any char into char
|
|
(provide uahgi2-lexer) |