@@ -134,3 +134,64 @@ export class Token {
134134export function TOKEN ( kind : TokenKind , pos : TokenPosition , opts ?: { hasLeftSpacing ?: boolean , value ?: Token [ 'value' ] , children ?: Token [ 'children' ] } ) : Token {
135135 return new Token ( kind , pos , opts ?. hasLeftSpacing , opts ?. value , opts ?. children ) ;
136136}
137+
138+ const KEYWORDS = [
139+ TokenKind . NullKeyword ,
140+ TokenKind . TrueKeyword ,
141+ TokenKind . FalseKeyword ,
142+ TokenKind . EachKeyword ,
143+ TokenKind . ForKeyword ,
144+ TokenKind . LoopKeyword ,
145+ TokenKind . DoKeyword ,
146+ TokenKind . WhileKeyword ,
147+ TokenKind . BreakKeyword ,
148+ TokenKind . ContinueKeyword ,
149+ TokenKind . MatchKeyword ,
150+ TokenKind . CaseKeyword ,
151+ TokenKind . DefaultKeyword ,
152+ TokenKind . IfKeyword ,
153+ TokenKind . ElifKeyword ,
154+ TokenKind . ElseKeyword ,
155+ TokenKind . ReturnKeyword ,
156+ TokenKind . EvalKeyword ,
157+ TokenKind . VarKeyword ,
158+ TokenKind . LetKeyword ,
159+ TokenKind . ExistsKeyword ,
160+ ] as const ;
161+
162+ export type KeywordTokenKind = ( typeof KEYWORDS ) [ number ] ;
163+
164+ export function isKeywordTokenKind ( token : TokenKind ) : token is KeywordTokenKind {
165+ return ( KEYWORDS as readonly TokenKind [ ] ) . includes ( token ) ;
166+ }
167+
168+ export function keywordTokenKindToString ( token : KeywordTokenKind ) : string {
169+ switch ( token ) {
170+ case TokenKind . NullKeyword : return 'null' ;
171+ case TokenKind . TrueKeyword : return 'true' ;
172+ case TokenKind . FalseKeyword : return 'false' ;
173+ case TokenKind . EachKeyword : return 'each' ;
174+ case TokenKind . ForKeyword : return 'for' ;
175+ case TokenKind . LoopKeyword : return 'loop' ;
176+ case TokenKind . DoKeyword : return 'do' ;
177+ case TokenKind . WhileKeyword : return 'while' ;
178+ case TokenKind . BreakKeyword : return 'break' ;
179+ case TokenKind . ContinueKeyword : return 'continue' ;
180+ case TokenKind . MatchKeyword : return 'match' ;
181+ case TokenKind . CaseKeyword : return 'case' ;
182+ case TokenKind . DefaultKeyword : return 'default' ;
183+ case TokenKind . IfKeyword : return 'if' ;
184+ case TokenKind . ElifKeyword : return 'elif' ;
185+ case TokenKind . ElseKeyword : return 'else' ;
186+ case TokenKind . ReturnKeyword : return 'return' ;
187+ case TokenKind . EvalKeyword : return 'eval' ;
188+ case TokenKind . VarKeyword : return 'var' ;
189+ case TokenKind . LetKeyword : return 'let' ;
190+ case TokenKind . ExistsKeyword : return 'exists' ;
191+ default : {
192+ // exhaustiveness check
193+ const _token : never = token ;
194+ throw new TypeError ( `Unknown keyword token kind ${ _token } ` ) ;
195+ }
196+ }
197+ }
0 commit comments