@@ -26,7 +26,6 @@ import highlight, ../utils
26
26
type
27
27
State = ref object of HighlightState
28
28
it: int
29
- is_float: bool
30
29
31
30
const
32
31
NIM_KEYWORDS = [
53
52
" bool" , " char" , " auto" , " pointer" ,
54
53
" cint" , " cshort" , " cstring" , " clong" ,
55
54
" cuint" , " culong" , " cushort" ,
56
- " openArray" , " Table" , " Deque" , " HashSet" , " range"
55
+ " openArray" , " Table" , " Deque" , " HashSet" , " range" ,
56
+ " untyped" , " typed" , " varargs"
57
57
]
58
58
59
59
@@ -64,7 +64,9 @@ proc token_kind(str: seq[Rune]): TokenKind =
64
64
return TokenKeyword
65
65
elif $ str in NIM_TYPES :
66
66
return TokenType
67
- elif str.is_int (allow_underscore= true ) or str.is_float (allow_underscore= true ):
67
+ elif str.is_int (allow_underscore= true ) or
68
+ str.is_float (allow_underscore= true ) or
69
+ ('\' ' in str and str.split ('\' ' )[0 ].is_float (true )):
68
70
return TokenLiteral
69
71
70
72
return TokenName
@@ -80,11 +82,16 @@ method next*(state: State, text: seq[Rune]): Token =
80
82
it = text.skip_string_like (start + 1 )
81
83
state = State (it: it + 1 )
82
84
return Token (kind: TokenString , start: start, stop: it + 1 , state: state)
83
- of '\' ' :
85
+ of '\' ' :
84
86
let
85
87
it = text.skip_string_like (start + 1 , end_char= '\' ' )
86
88
state = State (it: it + 1 )
87
89
return Token (kind: TokenChar , start: start, stop: it + 1 , state: state)
90
+ of '`' :
91
+ let
92
+ it = text.skip_string_like (start + 1 , end_char= '`' )
93
+ state = State (it: it + 1 )
94
+ return Token (kind: TokenName , start: start, stop: it + 1 , state: state)
88
95
of '#' :
89
96
if start + 1 < text.len and text[start + 1 ] == '[' :
90
97
var
@@ -106,37 +113,39 @@ method next*(state: State, text: seq[Rune]): Token =
106
113
it += 1
107
114
let state = State (it: it + 1 )
108
115
return Token (kind: TokenComment , start: start, stop: it, state: state)
109
- of ':' , '< ' , '>' , ' [' , ']' , '(' , ')' , '{' , '}' , ',' , ';' , '=' , '` ' :
116
+ of ':' , '. ' , '[' , ']' , '(' , ')' , '{' , '}' , ',' , ';' :
110
117
let state = State (it: start + 1 )
111
118
return Token (kind: TokenUnknown , start: start, stop: start + 1 , state: state)
112
- of '.' :
113
- var
114
- kind = TokenUnknown
115
- offset = 1
116
- if state.is_float and
117
- start + 1 < text.len and
118
- is_digit (text[start + 1 ]):
119
- kind = TokenLiteral
120
- offset = 2
119
+ of '\n ' :
121
120
let state = State (it: start + 1 )
122
- return Token (kind: kind , start: start, stop: start + offset , state: state)
121
+ return Token (kind: TokenUnknown , start: start, stop: start + 1 , state: state, can_stop: true )
123
122
else :
123
+ type NameKind = enum NameNone , NameOperator , NameText
124
+
124
125
var
125
126
name: seq [Rune ] = @ []
127
+ kind = NameNone
126
128
it = start
127
129
while it < text.len:
128
130
let chr = text[it]
129
131
case chr:
130
- of ' ' , '\t ' , '\n ' , '\r ' , ':' , '<' , '>' ,
132
+ of ' ' , '\t ' , '\n ' , '\r ' , ':' ,
131
133
'[' , ']' , '(' , ')' , '{' , '}' , ',' , ';' ,
132
- '=' , '`' , '\" ' , '#' , '\' ' , '.' :
133
- break
134
+ '`' , '\" ' , '#' , '\' ' , '.' :
135
+ if not (name.is_float (true ) and chr == '\' ' ):
136
+ break
137
+ of '+' , '-' , '*' , '/' , '=' , '<' , '>' , '!' , '$' , '%' , '&' , '|' , '?' :
138
+ if kind == NameText :
139
+ break
140
+ kind = NameOperator
134
141
else :
135
- name.add (chr)
142
+ if kind == NameOperator and
143
+ not (name.is_int (true ) and chr == '.' ):
144
+ break
145
+ kind = NameText
146
+ name.add (chr)
136
147
it += 1
137
- let
138
- kind = name.token_kind ()
139
- state = State (it: it, is_float: name.is_float (allow_underscore= true ))
140
- return Token (kind: kind, start: start, stop: it, state: state)
148
+ let state = State (it: it)
149
+ return Token (kind: name.token_kind (), start: start, stop: it, state: state)
141
150
142
151
proc new_nim_highlighter * (): HighlightState = State ()
0 commit comments