summaryrefslogtreecommitdiff
path: root/src/moe/anita/mai/token/TokenKind.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/moe/anita/mai/token/TokenKind.java')
-rw-r--r--src/moe/anita/mai/token/TokenKind.java100
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;