#lang scheme/base
(require parser-tools/lex
"abstract-regexps.ss"
"../../private/config.ss")
(provide (all-defined-out))
(define-abstract-regexps
[octal (range #\0 #\7)]
[decimal (range #\0 #\9)]
[positive (range #\1 #\9)]
[hex (union (range #\0 #\9) (range #\A #\F) (range #\a #\f))]
[exponent (union #\e #\E)]
[sign (union #\- #\+)]
[floatA (sequence (kleene+ decimal)
#\.
(kleene* decimal)
(maybe exponent sign (kleene+ decimal)))]
[floatB (sequence (kleene+ decimal)
(maybe #\. (kleene* decimal))
exponent (maybe sign) (kleene+ decimal))]
[floatC (sequence #\. (kleene+ decimal)
(maybe exponent (maybe sign) (kleene+ decimal)))]
[float (union floatA floatB floatC)]
[intH (sequence #\0 (union #\x #\X) (kleene+ hex))]
[intO (sequence #\0 (kleene+ octal))]
[intD (union #\0 (sequence positive (kleene* decimal)))]
[integer (union intH intO intD)]
[letter (union (range #\a #\z) (range #\A #\Z))]
[unicode-escape (sequence #\\ #\u hex hex hex hex)]
[identifier-start (union #\$ #\_ letter unicode-escape)]
[identifier (sequence identifier-start (kleene* (union identifier-start decimal)))]
[single-string (sequence #\'
(save (kleene* (union (sequence #\\ (any))
(complement #\'))))
#\')]
[double-string (sequence #\"
(save (kleene* (union (sequence #\\ (any))
(complement #\"))))
#\")]
[string-literal (union single-string double-string)]
[re-pattern (kleene* (union (sequence #\\ #\/)
(complement #\/ #\return #\newline)))]
[regexp-literal (sequence #\/ (save re-pattern) #\/ (maybe (save (union (sequence #\g (maybe #\i))
(sequence #\i (maybe #\g))))))]
[assignment-operator (union "|=" "^=" "&=" "<<=" ">>=" ">>>=" "+=" "-=" "*=" "/=" "%=" "=")]
[operator (union ";" "," "?" ":" "||" "&&" "|" "^" "&" "==="
"==" "=" "!==" "!=" "<<" "<=" "<" ">>>" ">>"
">=" ">" "++" "--" "+" "-" "*" "/" "%" "!"
"~" "." "[" "]" "{" "}" "(" ")")]
[line-comment (sequence "//" (kleene* (complement #\return #\newline)))]
[block-comment (sequence "/*"
(kleene* (union (complement #\*)
(sequence #\* (complement #\/))))
"*/")]
[comment (union line-comment block-comment)]
[ws (kleene+ (union #\tab #\return #\newline #\space #\vtab))]
[empty (kleene+ (union ws comment))])
(define-lex-abbrevs
[lex:float (make-lex float)]
[lex:integer (make-lex integer)]
[lex:regexp (make-lex regexp-literal)]
[lex:string (make-lex string-literal)]
[lex:assignment-operator (make-lex assignment-operator)]
[lex:operator (make-lex operator)]
[lex:identifier (make-lex identifier)]
[lex:line-comment (make-lex line-comment)]
[lex:block-comment (make-lex block-comment)]
[lex:comment (make-lex comment)]
[lex:whitespace (make-lex ws)]
[lex:empty (make-lex empty)])
(define rx:float (make-rx float))
(define rx:integer (make-rx integer))
(define rx:regexp (make-rx regexp-literal))
(define rx:string (make-rx string-literal))
(define rx:operator (make-rx operator))
(define rx:assignment-operator (make-rx assignment-operator))
(define rx:identifier (make-rx identifier))
(define rx:line-comment (make-rx line-comment))
(define rx:block-comment (make-rx block-comment))
(define rx:comment (make-rx comment))
(define rx:whitespace (make-rx ws))
(define rx:empty (make-rx empty))