#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)