diff options
Diffstat (limited to 'src/moe/anita/mai/token/TokenKind.java')
| -rw-r--r-- | src/moe/anita/mai/token/TokenKind.java | 100 |
1 files changed, 79 insertions, 21 deletions
diff --git a/src/moe/anita/mai/token/TokenKind.java b/src/moe/anita/mai/token/TokenKind.java index 2beadb2..7fd6439 100644 --- a/src/moe/anita/mai/token/TokenKind.java +++ b/src/moe/anita/mai/token/TokenKind.java @@ -1,5 +1,8 @@ package moe.anita.mai.token; +/** + * Identifies the kind of a lexical token. + */ public enum TokenKind { // Special @@ -8,7 +11,6 @@ public enum TokenKind { EOL, // Trivia - WHITESPACE, COMMENT, DOC_COMMENT, @@ -22,6 +24,48 @@ public enum TokenKind { RAW_STRING, RUNE, + TRUE, + FALSE, + NULL, + + // Keywords + PKG, + USE, + FN, + RET, + MUT, + FOR, + IF, + ELSE, + MATCH, + WITH, + INLAY, + ENUM, + ALIAS, + LINK, + BIND, + EX, + + I8, + I16, + I32, + I64, + ISIZE, + + U8, + U16, + U32, + U64, + USIZE, + + F32, + F64, + + BOOL, + RUNE_TYPE, + STRING_TYPE, + VOID, + // Delimiters LPAREN("("), RPAREN(")"), @@ -30,10 +74,14 @@ public enum TokenKind { LBRACE("{"), RBRACE("}"), + // Punctuation COMMA(","), DOT("."), + RANGE(".."), COLON(":"), SEMICOLON(";"), + QUESTION("?"), + AT("@"), // Assignment / declaration ASSIGN("="), @@ -63,30 +111,22 @@ public enum TokenKind { BIT_AND("&", Precedence.BIT_AND, Flags.INFIX), BIT_XOR("^", Precedence.BIT_XOR, Flags.INFIX), BIT_OR("|", Precedence.BIT_OR, Flags.INFIX), - BIT_NOT("~", Precedence.PREFIX, Flags.PREFIX), // Logical AND("&&", Precedence.LOGICAL_AND, Flags.INFIX), OR("||", Precedence.LOGICAL_OR, Flags.INFIX), - NOT("!", Precedence.PREFIX, Flags.PREFIX), - // Misc operators + // Arrows ARROW("->"), - BIND("<-"), - - RANGE(".."), - - QUESTION("?"), - AT("@"), + LEFT_ARROW("<-"), /* - * These are parser-created operators. + * Parser-created operators. * - * The lexer emits two LT or GT tokens instead of directly - * producing SHIFT_LEFT / SHIFT_RIGHT. This lets the parser - * distinguish shifts from nested generic type syntax. + * The lexer emits separate LT/GT tokens. The parser combines + * adjacent tokens into shifts where the grammar permits them. */ SHIFT_LEFT("<<", Precedence.SHIFT, Flags.INFIX), SHIFT_RIGHT(">>", Precedence.SHIFT, Flags.INFIX); @@ -109,32 +149,54 @@ public enum TokenKind { this.flags = flags; } + /** + * Returns the fixed spelling of this token kind, if one exists. + * + * @return token spelling, or null + */ public String spelling() { return spelling; } + /** + * Returns this token's Pratt precedence. + * + * @return precedence + */ public int precedence() { return precedence; } + /** + * Returns whether this token has a fixed spelling. + * + * @return true if a spelling exists + */ public boolean hasSpelling() { return spelling != null; } + /** + * Returns whether this token may be used as an infix operator. + * + * @return true if infix + */ public boolean isInfix() { return (flags & Flags.INFIX) != 0; } + /** + * Returns whether this token may be used as a prefix operator. + * + * @return true if prefix + */ public boolean isPrefix() { return (flags & Flags.PREFIX) != 0; } - - private static final class Flags { private static final int NONE = 0; - private static final int INFIX = 1 << 0; private static final int PREFIX = 1 << 1; @@ -146,9 +208,6 @@ public enum TokenKind { private static final int NONE = 0; - /* - * Larger values bind tighter. - */ private static final int LOGICAL_OR = 10; private static final int LOGICAL_AND = 20; @@ -157,7 +216,6 @@ public enum TokenKind { private static final int BIT_AND = 50; private static final int COMPARE = 60; - private static final int SHIFT = 70; private static final int ADD = 80; |
