| ... | ... | @@ -277,83 +277,79 @@ pub const Token = struct { |
| 277 | 277 | }; |
| 278 | 278 | |
| 279 | 279 | // TODO extensions |
| 280 | | pub const keywords = [_]Keyword{ |
| 281 | | Keyword.init("auto", .Keyword_auto), |
| 282 | | Keyword.init("break", .Keyword_break), |
| 283 | | Keyword.init("case", .Keyword_case), |
| 284 | | Keyword.init("char", .Keyword_char), |
| 285 | | Keyword.init("const", .Keyword_const), |
| 286 | | Keyword.init("continue", .Keyword_continue), |
| 287 | | Keyword.init("default", .Keyword_default), |
| 288 | | Keyword.init("do", .Keyword_do), |
| 289 | | Keyword.init("double", .Keyword_double), |
| 290 | | Keyword.init("else", .Keyword_else), |
| 291 | | Keyword.init("enum", .Keyword_enum), |
| 292 | | Keyword.init("extern", .Keyword_extern), |
| 293 | | Keyword.init("float", .Keyword_float), |
| 294 | | Keyword.init("for", .Keyword_for), |
| 295 | | Keyword.init("goto", .Keyword_goto), |
| 296 | | Keyword.init("if", .Keyword_if), |
| 297 | | Keyword.init("int", .Keyword_int), |
| 298 | | Keyword.init("long", .Keyword_long), |
| 299 | | Keyword.init("register", .Keyword_register), |
| 300 | | Keyword.init("return", .Keyword_return), |
| 301 | | Keyword.init("short", .Keyword_short), |
| 302 | | Keyword.init("signed", .Keyword_signed), |
| 303 | | Keyword.init("sizeof", .Keyword_sizeof), |
| 304 | | Keyword.init("static", .Keyword_static), |
| 305 | | Keyword.init("struct", .Keyword_struct), |
| 306 | | Keyword.init("switch", .Keyword_switch), |
| 307 | | Keyword.init("typedef", .Keyword_typedef), |
| 308 | | Keyword.init("union", .Keyword_union), |
| 309 | | Keyword.init("unsigned", .Keyword_unsigned), |
| 310 | | Keyword.init("void", .Keyword_void), |
| 311 | | Keyword.init("volatile", .Keyword_volatile), |
| 312 | | Keyword.init("while", .Keyword_while), |
| 280 | pub const keywords = std.ComptimeStringMap(Id, .{ |
| 281 | .{"auto", .Keyword_auto}, |
| 282 | .{"break", .Keyword_break}, |
| 283 | .{"case", .Keyword_case}, |
| 284 | .{"char", .Keyword_char}, |
| 285 | .{"const", .Keyword_const}, |
| 286 | .{"continue", .Keyword_continue}, |
| 287 | .{"default", .Keyword_default}, |
| 288 | .{"do", .Keyword_do}, |
| 289 | .{"double", .Keyword_double}, |
| 290 | .{"else", .Keyword_else}, |
| 291 | .{"enum", .Keyword_enum}, |
| 292 | .{"extern", .Keyword_extern}, |
| 293 | .{"float", .Keyword_float}, |
| 294 | .{"for", .Keyword_for}, |
| 295 | .{"goto", .Keyword_goto}, |
| 296 | .{"if", .Keyword_if}, |
| 297 | .{"int", .Keyword_int}, |
| 298 | .{"long", .Keyword_long}, |
| 299 | .{"register", .Keyword_register}, |
| 300 | .{"return", .Keyword_return}, |
| 301 | .{"short", .Keyword_short}, |
| 302 | .{"signed", .Keyword_signed}, |
| 303 | .{"sizeof", .Keyword_sizeof}, |
| 304 | .{"static", .Keyword_static}, |
| 305 | .{"struct", .Keyword_struct}, |
| 306 | .{"switch", .Keyword_switch}, |
| 307 | .{"typedef", .Keyword_typedef}, |
| 308 | .{"union", .Keyword_union}, |
| 309 | .{"unsigned", .Keyword_unsigned}, |
| 310 | .{"void", .Keyword_void}, |
| 311 | .{"volatile", .Keyword_volatile}, |
| 312 | .{"while", .Keyword_while}, |
| 313 | 313 | |
| 314 | 314 | // ISO C99 |
| 315 | | Keyword.init("_Bool", .Keyword_bool), |
| 316 | | Keyword.init("_Complex", .Keyword_complex), |
| 317 | | Keyword.init("_Imaginary", .Keyword_imaginary), |
| 318 | | Keyword.init("inline", .Keyword_inline), |
| 319 | | Keyword.init("restrict", .Keyword_restrict), |
| 315 | .{"_Bool", .Keyword_bool}, |
| 316 | .{"_Complex", .Keyword_complex}, |
| 317 | .{"_Imaginary", .Keyword_imaginary}, |
| 318 | .{"inline", .Keyword_inline}, |
| 319 | .{"restrict", .Keyword_restrict}, |
| 320 | 320 | |
| 321 | 321 | // ISO C11 |
| 322 | | Keyword.init("_Alignas", .Keyword_alignas), |
| 323 | | Keyword.init("_Alignof", .Keyword_alignof), |
| 324 | | Keyword.init("_Atomic", .Keyword_atomic), |
| 325 | | Keyword.init("_Generic", .Keyword_generic), |
| 326 | | Keyword.init("_Noreturn", .Keyword_noreturn), |
| 327 | | Keyword.init("_Static_assert", .Keyword_static_assert), |
| 328 | | Keyword.init("_Thread_local", .Keyword_thread_local), |
| 322 | .{"_Alignas", .Keyword_alignas}, |
| 323 | .{"_Alignof", .Keyword_alignof}, |
| 324 | .{"_Atomic", .Keyword_atomic}, |
| 325 | .{"_Generic", .Keyword_generic}, |
| 326 | .{"_Noreturn", .Keyword_noreturn}, |
| 327 | .{"_Static_assert", .Keyword_static_assert}, |
| 328 | .{"_Thread_local", .Keyword_thread_local}, |
| 329 | 329 | |
| 330 | 330 | // Preprocessor directives |
| 331 | | Keyword.init("include", .Keyword_include), |
| 332 | | Keyword.init("define", .Keyword_define), |
| 333 | | Keyword.init("ifdef", .Keyword_ifdef), |
| 334 | | Keyword.init("ifndef", .Keyword_ifndef), |
| 335 | | Keyword.init("error", .Keyword_error), |
| 336 | | Keyword.init("pragma", .Keyword_pragma), |
| 337 | | }; |
| 331 | .{"include", .Keyword_include}, |
| 332 | .{"define", .Keyword_define}, |
| 333 | .{"ifdef", .Keyword_ifdef}, |
| 334 | .{"ifndef", .Keyword_ifndef}, |
| 335 | .{"error", .Keyword_error}, |
| 336 | .{"pragma", .Keyword_pragma}, |
| 337 | }); |
| 338 | 338 | |
| 339 | | // TODO perfect hash at comptime |
| 340 | 339 | // TODO do this in the preprocessor |
| 341 | 340 | pub fn getKeyword(bytes: []const u8, pp_directive: bool) ?Id { |
| 342 | | var hash = std.hash_map.hashString(bytes); |
| 343 | | for (keywords) |kw| { |
| 344 | | if (kw.hash == hash and mem.eql(u8, kw.bytes, bytes)) { |
| 345 | | switch (kw.id) { |
| 346 | | .Keyword_include, |
| 347 | | .Keyword_define, |
| 348 | | .Keyword_ifdef, |
| 349 | | .Keyword_ifndef, |
| 350 | | .Keyword_error, |
| 351 | | .Keyword_pragma, |
| 352 | | => if (!pp_directive) return null, |
| 353 | | else => {}, |
| 354 | | } |
| 355 | | return kw.id; |
| 341 | if (keywords.get(bytes)) |id| { |
| 342 | switch (id) { |
| 343 | .Keyword_include, |
| 344 | .Keyword_define, |
| 345 | .Keyword_ifdef, |
| 346 | .Keyword_ifndef, |
| 347 | .Keyword_error, |
| 348 | .Keyword_pragma, |
| 349 | => if (!pp_directive) return null, |
| 350 | else => {}, |
| 356 | 351 | } |
| 352 | return id; |
| 357 | 353 | } |
| 358 | 354 | return null; |
| 359 | 355 | } |