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:
@@ -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 "<?>";
|
||||
};
|
||||
|
||||
|
||||
@@ -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 "<?>";
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user