lib/ww/lex: tokname if-ladder -> switch (Wave-2 structural)

Fold the ~88-arm `if (k == tkind.TK_X) return "..."` ladder in tokname
to a single `switch (k)` with the terminal `return "<?>"` as the
fall-past default. kwlookup stays an if-ladder: it dispatches on
streqn() string compares over distinct literals, which a value-switch
can't express.

Not byte-id-neutral (if-chain -> switch dispatch changes the asm), so
the ladder->switch equivalence is pinned by a new table-driven test:
lib/ww/lex/toktest.ww drives tokname over every tkind plus the
out-of-band "<?>" fallback, and kwlookup over every keyword plus
non-keywords, wired as 904_tok_run (same `ww run` @test shape as
904_ascii_run). The 990_selfhost wwdump diff only covers kinds that
appear in its corpus.

Regenerates the w6c + wwdump combined.ww amalgamations (tokname region
only).
This commit is contained in:
2026-06-02 21:58:39 +09:00
parent 79e647b34d
commit e027d3eec4
6 changed files with 505 additions and 265 deletions

View File

@@ -6579,102 +6579,104 @@ export fn kwlookup(p: *u8, n: i32) tkind = {
// the C tokname()'s output exactly so wwdump output diffs cleanly.
export fn tokname(k: tkind) str = {
if (k == tkind.TK_NONE) { return "<none>"; };
if (k == tkind.TK_EOF) { return "EOF"; };
if (k == tkind.TK_ERR) { return "ERR"; };
if (k == tkind.TK_IDENT) { return "IDENT"; };
if (k == tkind.TK_INT) { return "INT"; };
if (k == tkind.TK_FLOAT) { return "FLOAT"; };
if (k == tkind.TK_RUNE) { return "RUNE"; };
if (k == tkind.TK_STR) { return "STR"; };
switch (k) {
case tkind.TK_NONE: return "<none>";
case tkind.TK_EOF: return "EOF";
case tkind.TK_ERR: return "ERR";
case tkind.TK_IDENT: return "IDENT";
case tkind.TK_INT: return "INT";
case tkind.TK_FLOAT: return "FLOAT";
case tkind.TK_RUNE: return "RUNE";
case tkind.TK_STR: return "STR";
if (k == tkind.TK_FN) { return "fn"; };
if (k == tkind.TK_LET) { return "let"; };
if (k == tkind.TK_DEF) { return "def"; };
if (k == tkind.TK_IF) { return "if"; };
if (k == tkind.TK_ELSE) { return "else"; };
if (k == tkind.TK_FOR) { return "for"; };
if (k == tkind.TK_SWITCH) { return "switch"; };
if (k == tkind.TK_CASE) { return "case"; };
if (k == tkind.TK_RETURN) { return "return"; };
if (k == tkind.TK_USE) { return "import"; };
if (k == tkind.TK_TYPE) { return "type"; };
if (k == tkind.TK_STRUCT) { return "struct"; };
if (k == tkind.TK_DEFER) { return "defer"; };
if (k == tkind.TK_BREAK) { return "break"; };
if (k == tkind.TK_CONTINUE) { return "continue"; };
if (k == tkind.TK_EXPORT) { return "export"; };
if (k == tkind.TK_PROC) { return "proc"; };
if (k == tkind.TK_CHAN) { return "chan"; };
if (k == tkind.TK_NIL) { return "nil"; };
if (k == tkind.TK_TRUE) { return "true"; };
if (k == tkind.TK_FALSE) { return "false"; };
if (k == tkind.TK_AS) { return "as"; };
if (k == tkind.TK_IS) { return "is"; };
if (k == tkind.TK_VOID) { return "void"; };
if (k == tkind.TK_YIELD) { return "yield"; };
if (k == tkind.TK_STATIC) { return "static"; };
if (k == tkind.TK_MATCH) { return "match"; };
if (k == tkind.TK_CONST) { return "const"; };
if (k == tkind.TK_UNDER) { return "_"; };
if (k == tkind.TK_ENUM) { return "enum"; };
if (k == tkind.TK_MODULE) { return "package"; };
case tkind.TK_FN: return "fn";
case tkind.TK_LET: return "let";
case tkind.TK_DEF: return "def";
case tkind.TK_IF: return "if";
case tkind.TK_ELSE: return "else";
case tkind.TK_FOR: return "for";
case tkind.TK_SWITCH: return "switch";
case tkind.TK_CASE: return "case";
case tkind.TK_RETURN: return "return";
case tkind.TK_USE: return "import";
case tkind.TK_TYPE: return "type";
case tkind.TK_STRUCT: return "struct";
case tkind.TK_DEFER: return "defer";
case tkind.TK_BREAK: return "break";
case tkind.TK_CONTINUE: return "continue";
case tkind.TK_EXPORT: return "export";
case tkind.TK_PROC: return "proc";
case tkind.TK_CHAN: return "chan";
case tkind.TK_NIL: return "nil";
case tkind.TK_TRUE: return "true";
case tkind.TK_FALSE: return "false";
case tkind.TK_AS: return "as";
case tkind.TK_IS: return "is";
case tkind.TK_VOID: return "void";
case tkind.TK_YIELD: return "yield";
case tkind.TK_STATIC: return "static";
case tkind.TK_MATCH: return "match";
case tkind.TK_CONST: return "const";
case tkind.TK_UNDER: return "_";
case tkind.TK_ENUM: return "enum";
case tkind.TK_MODULE: return "package";
if (k == tkind.TK_LPAREN) { return "("; };
if (k == tkind.TK_RPAREN) { return ")"; };
if (k == tkind.TK_LBRACE) { return "{"; };
if (k == tkind.TK_RBRACE) { return "}"; };
if (k == tkind.TK_LBRACK) { return "["; };
if (k == tkind.TK_RBRACK) { return "]"; };
if (k == tkind.TK_COMMA) { return ","; };
if (k == tkind.TK_SEMI) { return ";"; };
if (k == tkind.TK_COLON) { return ":"; };
if (k == tkind.TK_DOT) { return "."; };
if (k == tkind.TK_ELLIPSIS) { return "..."; };
if (k == tkind.TK_DOTDOT) { return ".."; };
if (k == tkind.TK_AT) { return "@"; };
if (k == tkind.TK_QUESTION) { return "?"; };
case tkind.TK_LPAREN: return "(";
case tkind.TK_RPAREN: return ")";
case tkind.TK_LBRACE: return "{";
case tkind.TK_RBRACE: return "}";
case tkind.TK_LBRACK: return "[";
case tkind.TK_RBRACK: return "]";
case tkind.TK_COMMA: return ",";
case tkind.TK_SEMI: return ";";
case tkind.TK_COLON: return ":";
case tkind.TK_DOT: return ".";
case tkind.TK_ELLIPSIS: return "...";
case tkind.TK_DOTDOT: return "..";
case tkind.TK_AT: return "@";
case tkind.TK_QUESTION: return "?";
if (k == tkind.TK_ASSIGN) { return "="; };
if (k == tkind.TK_PLUSEQ) { return "+="; };
if (k == tkind.TK_MINUSEQ) { return "-="; };
if (k == tkind.TK_STAREQ) { return "*="; };
if (k == tkind.TK_SLASHEQ) { return "/="; };
if (k == tkind.TK_PERCENTEQ) { return "%="; };
if (k == tkind.TK_AMPEQ) { return "&="; };
if (k == tkind.TK_PIPEEQ) { return "|="; };
if (k == tkind.TK_CARETEQ) { return "^="; };
if (k == tkind.TK_LSHIFTEQ) { return "<<="; };
if (k == tkind.TK_RSHIFTEQ) { return ">>="; };
case tkind.TK_ASSIGN: return "=";
case tkind.TK_PLUSEQ: return "+=";
case tkind.TK_MINUSEQ: return "-=";
case tkind.TK_STAREQ: return "*=";
case tkind.TK_SLASHEQ: return "/=";
case tkind.TK_PERCENTEQ: return "%=";
case tkind.TK_AMPEQ: return "&=";
case tkind.TK_PIPEEQ: return "|=";
case tkind.TK_CARETEQ: return "^=";
case tkind.TK_LSHIFTEQ: return "<<=";
case tkind.TK_RSHIFTEQ: return ">>=";
if (k == tkind.TK_PLUS) { return "+"; };
if (k == tkind.TK_MINUS) { return "-"; };
if (k == tkind.TK_STAR) { return "*"; };
if (k == tkind.TK_SLASH) { return "/"; };
if (k == tkind.TK_PERCENT) { return "%"; };
if (k == tkind.TK_AMP) { return "&"; };
if (k == tkind.TK_PIPE) { return "|"; };
if (k == tkind.TK_CARET) { return "^"; };
if (k == tkind.TK_TILDE) { return "~"; };
if (k == tkind.TK_LSHIFT) { return "<<"; };
if (k == tkind.TK_RSHIFT) { return ">>"; };
case tkind.TK_PLUS: return "+";
case tkind.TK_MINUS: return "-";
case tkind.TK_STAR: return "*";
case tkind.TK_SLASH: return "/";
case tkind.TK_PERCENT: return "%";
case tkind.TK_AMP: return "&";
case tkind.TK_PIPE: return "|";
case tkind.TK_CARET: return "^";
case tkind.TK_TILDE: return "~";
case tkind.TK_LSHIFT: return "<<";
case tkind.TK_RSHIFT: return ">>";
if (k == tkind.TK_EQ) { return "=="; };
if (k == tkind.TK_NEQ) { return "!="; };
if (k == tkind.TK_LT) { return "<"; };
if (k == tkind.TK_LE) { return "<="; };
if (k == tkind.TK_GT) { return ">"; };
if (k == tkind.TK_GE) { return ">="; };
case tkind.TK_EQ: return "==";
case tkind.TK_NEQ: return "!=";
case tkind.TK_LT: return "<";
case tkind.TK_LE: return "<=";
case tkind.TK_GT: return ">";
case tkind.TK_GE: return ">=";
if (k == tkind.TK_AND) { return "&&"; };
if (k == tkind.TK_OR) { return "||"; };
if (k == tkind.TK_NOT) { return "!"; };
case tkind.TK_AND: return "&&";
case tkind.TK_OR: return "||";
case tkind.TK_NOT: return "!";
if (k == tkind.TK_LARROW) { return "<-"; };
if (k == tkind.TK_ARROW) { return "->"; };
if (k == tkind.TK_FATARROW) { return "=>"; };
case tkind.TK_LARROW: return "<-";
case tkind.TK_ARROW: return "->";
case tkind.TK_FATARROW: return "=>";
if (k == tkind.TK_LAST) { return "<last>"; };
case tkind.TK_LAST: return "<last>";
};
return "<?>";
};

View File

@@ -6579,102 +6579,104 @@ export fn kwlookup(p: *u8, n: i32) tkind = {
// the C tokname()'s output exactly so wwdump output diffs cleanly.
export fn tokname(k: tkind) str = {
if (k == tkind.TK_NONE) { return "<none>"; };
if (k == tkind.TK_EOF) { return "EOF"; };
if (k == tkind.TK_ERR) { return "ERR"; };
if (k == tkind.TK_IDENT) { return "IDENT"; };
if (k == tkind.TK_INT) { return "INT"; };
if (k == tkind.TK_FLOAT) { return "FLOAT"; };
if (k == tkind.TK_RUNE) { return "RUNE"; };
if (k == tkind.TK_STR) { return "STR"; };
switch (k) {
case tkind.TK_NONE: return "<none>";
case tkind.TK_EOF: return "EOF";
case tkind.TK_ERR: return "ERR";
case tkind.TK_IDENT: return "IDENT";
case tkind.TK_INT: return "INT";
case tkind.TK_FLOAT: return "FLOAT";
case tkind.TK_RUNE: return "RUNE";
case tkind.TK_STR: return "STR";
if (k == tkind.TK_FN) { return "fn"; };
if (k == tkind.TK_LET) { return "let"; };
if (k == tkind.TK_DEF) { return "def"; };
if (k == tkind.TK_IF) { return "if"; };
if (k == tkind.TK_ELSE) { return "else"; };
if (k == tkind.TK_FOR) { return "for"; };
if (k == tkind.TK_SWITCH) { return "switch"; };
if (k == tkind.TK_CASE) { return "case"; };
if (k == tkind.TK_RETURN) { return "return"; };
if (k == tkind.TK_USE) { return "import"; };
if (k == tkind.TK_TYPE) { return "type"; };
if (k == tkind.TK_STRUCT) { return "struct"; };
if (k == tkind.TK_DEFER) { return "defer"; };
if (k == tkind.TK_BREAK) { return "break"; };
if (k == tkind.TK_CONTINUE) { return "continue"; };
if (k == tkind.TK_EXPORT) { return "export"; };
if (k == tkind.TK_PROC) { return "proc"; };
if (k == tkind.TK_CHAN) { return "chan"; };
if (k == tkind.TK_NIL) { return "nil"; };
if (k == tkind.TK_TRUE) { return "true"; };
if (k == tkind.TK_FALSE) { return "false"; };
if (k == tkind.TK_AS) { return "as"; };
if (k == tkind.TK_IS) { return "is"; };
if (k == tkind.TK_VOID) { return "void"; };
if (k == tkind.TK_YIELD) { return "yield"; };
if (k == tkind.TK_STATIC) { return "static"; };
if (k == tkind.TK_MATCH) { return "match"; };
if (k == tkind.TK_CONST) { return "const"; };
if (k == tkind.TK_UNDER) { return "_"; };
if (k == tkind.TK_ENUM) { return "enum"; };
if (k == tkind.TK_MODULE) { return "package"; };
case tkind.TK_FN: return "fn";
case tkind.TK_LET: return "let";
case tkind.TK_DEF: return "def";
case tkind.TK_IF: return "if";
case tkind.TK_ELSE: return "else";
case tkind.TK_FOR: return "for";
case tkind.TK_SWITCH: return "switch";
case tkind.TK_CASE: return "case";
case tkind.TK_RETURN: return "return";
case tkind.TK_USE: return "import";
case tkind.TK_TYPE: return "type";
case tkind.TK_STRUCT: return "struct";
case tkind.TK_DEFER: return "defer";
case tkind.TK_BREAK: return "break";
case tkind.TK_CONTINUE: return "continue";
case tkind.TK_EXPORT: return "export";
case tkind.TK_PROC: return "proc";
case tkind.TK_CHAN: return "chan";
case tkind.TK_NIL: return "nil";
case tkind.TK_TRUE: return "true";
case tkind.TK_FALSE: return "false";
case tkind.TK_AS: return "as";
case tkind.TK_IS: return "is";
case tkind.TK_VOID: return "void";
case tkind.TK_YIELD: return "yield";
case tkind.TK_STATIC: return "static";
case tkind.TK_MATCH: return "match";
case tkind.TK_CONST: return "const";
case tkind.TK_UNDER: return "_";
case tkind.TK_ENUM: return "enum";
case tkind.TK_MODULE: return "package";
if (k == tkind.TK_LPAREN) { return "("; };
if (k == tkind.TK_RPAREN) { return ")"; };
if (k == tkind.TK_LBRACE) { return "{"; };
if (k == tkind.TK_RBRACE) { return "}"; };
if (k == tkind.TK_LBRACK) { return "["; };
if (k == tkind.TK_RBRACK) { return "]"; };
if (k == tkind.TK_COMMA) { return ","; };
if (k == tkind.TK_SEMI) { return ";"; };
if (k == tkind.TK_COLON) { return ":"; };
if (k == tkind.TK_DOT) { return "."; };
if (k == tkind.TK_ELLIPSIS) { return "..."; };
if (k == tkind.TK_DOTDOT) { return ".."; };
if (k == tkind.TK_AT) { return "@"; };
if (k == tkind.TK_QUESTION) { return "?"; };
case tkind.TK_LPAREN: return "(";
case tkind.TK_RPAREN: return ")";
case tkind.TK_LBRACE: return "{";
case tkind.TK_RBRACE: return "}";
case tkind.TK_LBRACK: return "[";
case tkind.TK_RBRACK: return "]";
case tkind.TK_COMMA: return ",";
case tkind.TK_SEMI: return ";";
case tkind.TK_COLON: return ":";
case tkind.TK_DOT: return ".";
case tkind.TK_ELLIPSIS: return "...";
case tkind.TK_DOTDOT: return "..";
case tkind.TK_AT: return "@";
case tkind.TK_QUESTION: return "?";
if (k == tkind.TK_ASSIGN) { return "="; };
if (k == tkind.TK_PLUSEQ) { return "+="; };
if (k == tkind.TK_MINUSEQ) { return "-="; };
if (k == tkind.TK_STAREQ) { return "*="; };
if (k == tkind.TK_SLASHEQ) { return "/="; };
if (k == tkind.TK_PERCENTEQ) { return "%="; };
if (k == tkind.TK_AMPEQ) { return "&="; };
if (k == tkind.TK_PIPEEQ) { return "|="; };
if (k == tkind.TK_CARETEQ) { return "^="; };
if (k == tkind.TK_LSHIFTEQ) { return "<<="; };
if (k == tkind.TK_RSHIFTEQ) { return ">>="; };
case tkind.TK_ASSIGN: return "=";
case tkind.TK_PLUSEQ: return "+=";
case tkind.TK_MINUSEQ: return "-=";
case tkind.TK_STAREQ: return "*=";
case tkind.TK_SLASHEQ: return "/=";
case tkind.TK_PERCENTEQ: return "%=";
case tkind.TK_AMPEQ: return "&=";
case tkind.TK_PIPEEQ: return "|=";
case tkind.TK_CARETEQ: return "^=";
case tkind.TK_LSHIFTEQ: return "<<=";
case tkind.TK_RSHIFTEQ: return ">>=";
if (k == tkind.TK_PLUS) { return "+"; };
if (k == tkind.TK_MINUS) { return "-"; };
if (k == tkind.TK_STAR) { return "*"; };
if (k == tkind.TK_SLASH) { return "/"; };
if (k == tkind.TK_PERCENT) { return "%"; };
if (k == tkind.TK_AMP) { return "&"; };
if (k == tkind.TK_PIPE) { return "|"; };
if (k == tkind.TK_CARET) { return "^"; };
if (k == tkind.TK_TILDE) { return "~"; };
if (k == tkind.TK_LSHIFT) { return "<<"; };
if (k == tkind.TK_RSHIFT) { return ">>"; };
case tkind.TK_PLUS: return "+";
case tkind.TK_MINUS: return "-";
case tkind.TK_STAR: return "*";
case tkind.TK_SLASH: return "/";
case tkind.TK_PERCENT: return "%";
case tkind.TK_AMP: return "&";
case tkind.TK_PIPE: return "|";
case tkind.TK_CARET: return "^";
case tkind.TK_TILDE: return "~";
case tkind.TK_LSHIFT: return "<<";
case tkind.TK_RSHIFT: return ">>";
if (k == tkind.TK_EQ) { return "=="; };
if (k == tkind.TK_NEQ) { return "!="; };
if (k == tkind.TK_LT) { return "<"; };
if (k == tkind.TK_LE) { return "<="; };
if (k == tkind.TK_GT) { return ">"; };
if (k == tkind.TK_GE) { return ">="; };
case tkind.TK_EQ: return "==";
case tkind.TK_NEQ: return "!=";
case tkind.TK_LT: return "<";
case tkind.TK_LE: return "<=";
case tkind.TK_GT: return ">";
case tkind.TK_GE: return ">=";
if (k == tkind.TK_AND) { return "&&"; };
if (k == tkind.TK_OR) { return "||"; };
if (k == tkind.TK_NOT) { return "!"; };
case tkind.TK_AND: return "&&";
case tkind.TK_OR: return "||";
case tkind.TK_NOT: return "!";
if (k == tkind.TK_LARROW) { return "<-"; };
if (k == tkind.TK_ARROW) { return "->"; };
if (k == tkind.TK_FATARROW) { return "=>"; };
case tkind.TK_LARROW: return "<-";
case tkind.TK_ARROW: return "->";
case tkind.TK_FATARROW: return "=>";
if (k == tkind.TK_LAST) { return "<last>"; };
case tkind.TK_LAST: return "<last>";
};
return "<?>";
};