#lang scheme/base
(require parser-tools/lex
(prefix-in : parser-tools/lex-sre)
"../private/syntax/regexps.ss"
"../private/config.ss")
(provide get-syntax-token)
(define (syn-val lex a b c d)
(values lex a b (position-offset c) (position-offset d)))
(define (colorize-string delimiter my-start-pos)
(define lxr
(lexer
[(:or #\' #\")
(if (string=? lexeme delimiter)
(syn-val "" 'string #f my-start-pos end-pos)
(lxr input-port))]
[(eof) (syn-val "" 'error #f my-start-pos end-pos)]
[(:seq #\\ (:or #\' #\")) (lxr input-port)]
[any-char (lxr input-port)]))
lxr)
(define (colorize-block-comment my-start-pos)
(define lxr
(lexer
[(:seq #\* #\/)
(syn-val "" 'comment #f my-start-pos end-pos)]
[(eof) (syn-val "" 'error #f my-start-pos end-pos)]
[any-char (lxr input-port)]))
lxr)
(define get-syntax-token
(lexer
[(:or "true" "false" "null")
(syn-val lexeme 'literal #f start-pos end-pos)]
[lex:integer
(syn-val lexeme 'literal #f start-pos end-pos)]
[lex:float
(syn-val lexeme 'literal #f start-pos end-pos)]
[(:or "[" "]" "{" "}" "(" ")")
(syn-val lexeme 'parenthesis (string->symbol lexeme) start-pos end-pos)]
[(:or "," ":" ";" "=" ".")
(syn-val lexeme 'default #f start-pos end-pos)]
[(:seq #\/ #\*)
((colorize-block-comment start-pos) input-port)]
[lex:line-comment
(syn-val lexeme 'comment #f start-pos end-pos)]
[lex:assignment-operator
(syn-val lexeme 'keyword #f start-pos end-pos)]
[lex:operator
(syn-val lexeme 'keyword #f start-pos end-pos)]
[lex:identifier
(if (memq (string->symbol lexeme) (lexical-keywords))
(syn-val lexeme 'keyword #f start-pos end-pos)
(syn-val lexeme 'identifier #f start-pos end-pos))]
[(:or #\' #\")
((colorize-string lexeme start-pos) input-port)]
[(:+ lex:whitespace)
(syn-val lexeme 'whitespace #f start-pos end-pos)]
[(eof)
(syn-val lexeme 'eof #f start-pos end-pos)]
[any-char
(syn-val lexeme 'error #f start-pos end-pos)]
))