|
| 1 | +/* |
| 2 | + * Minecraft Dev for IntelliJ |
| 3 | + * |
| 4 | + * https://minecraftdev.org |
| 5 | + * |
| 6 | + * Copyright (c) 2017 minecraft-dev |
| 7 | + * |
| 8 | + * MIT License |
| 9 | + */ |
| 10 | + |
| 11 | +package com.demonwav.mcdev.nbt.lang.gen; |
| 12 | + |
| 13 | +import com.intellij.lexer.*; |
| 14 | +import com.intellij.psi.tree.IElementType; |
| 15 | +import static com.demonwav.mcdev.nbt.lang.gen.psi.NbttTypes.*; |
| 16 | +import static com.intellij.psi.TokenType.*; |
| 17 | + |
| 18 | +%% |
| 19 | + |
| 20 | +%{ |
| 21 | + public java.util.Deque<Integer> stack = new java.util.ArrayDeque<Integer>(); |
| 22 | + |
| 23 | + public NbttLexer() { |
| 24 | + this((java.io.Reader)null); |
| 25 | + } |
| 26 | + |
| 27 | + public void maybeBegin(Integer i) { |
| 28 | + if (i != null) { |
| 29 | + yybegin(i); |
| 30 | + } |
| 31 | + } |
| 32 | +%} |
| 33 | + |
| 34 | +%public |
| 35 | +%class NbttLexer |
| 36 | +%implements FlexLexer |
| 37 | +%function advance |
| 38 | +%type IElementType |
| 39 | + |
| 40 | +%s IN_BYTE_ARRAY |
| 41 | +%s IN_INT_ARRAY |
| 42 | +%s IN_LONG_ARRAY |
| 43 | +%s IN_LIST |
| 44 | +%s EXPECT_NEXT |
| 45 | + |
| 46 | +%unicode |
| 47 | + |
| 48 | +EOL_WS = \n | \r | \r\n |
| 49 | +LINE_WS = \s |
| 50 | +WHITE_SPACE_CHAR = {EOL_WS} | {LINE_WS} |
| 51 | +WHITE_SPACE = {WHITE_SPACE_CHAR}+ |
| 52 | + |
| 53 | +BYTE_LITERAL = [+-]?\d+[bB]|true|false |
| 54 | +SHORT_LITERAL = [+-]?\d+[sS] |
| 55 | +INT_LITERAL = [+-]?\d+[iI]? |
| 56 | +LONG_LITERAL = [+-]?\d+[lL] |
| 57 | +FLOAT_LITERAL = [+-]?(\d+(\.\d*(E\d+)?)?[fF]|\d*\.\d+(E\d+)?[fF]|Infinity[fF])|NaN[fF] |
| 58 | +DOUBLE_LITERAL = [+-]?(\d*\.\d+(E\d+)?[dD|]?|\d+\.\d*(E\d+)?[dD|]?|\d+(E\d+)?[dD|]|Infinity[dD|]?)|NaN[dD|]? |
| 59 | + |
| 60 | +STRING_LITERAL = \"([^\"\\\n]|(\\[\"\\nt]))*[\"\n] |
| 61 | +UNQUOTED_STRING_LITERAL = ([^\"\s\n:{}\[\](),\d+\-]|\\[\"\\nt])|([^\"\s\n:{}\[\](),\d+\-]|\\[\"\\nt])([^\"\\:{}\[\](),\n]|\\[\"\\nt])*[^\"\s\n:{}\[\](),] |
| 62 | + |
| 63 | +BYTE_ARRAY_LITERAL = [+-]?\d+[bB]?|true|false |
| 64 | +ARRAY_INT_LITEARL = [+-]?\d+[iI] |
| 65 | + |
| 66 | +LONG_ARRAY_LITERAL = [+-]?\d+[lL]? |
| 67 | + |
| 68 | + |
| 69 | +%% |
| 70 | + |
| 71 | +<YYINITIAL> { |
| 72 | + ":" { return COLON; } |
| 73 | + "}" { maybeBegin(stack.pollFirst()); return RBRACE; } |
| 74 | + "]" { maybeBegin(stack.pollFirst()); return RBRACKET; } |
| 75 | + ")" { maybeBegin(stack.pollFirst()); return RPAREN; } |
| 76 | + "{" { stack.offerFirst(YYINITIAL); return LBRACE; } |
| 77 | + "[" { stack.offerFirst(YYINITIAL); yybegin(IN_LIST); return LBRACKET; } |
| 78 | + "bytes" { stack.offerFirst(YYINITIAL); yybegin(IN_BYTE_ARRAY); return BYTES; } |
| 79 | + "ints" { stack.offerFirst(YYINITIAL); yybegin(IN_INT_ARRAY); return INTS; } |
| 80 | + "longs" { stack.offerFirst(YYINITIAL); yybegin(IN_LONG_ARRAY); return LONGS; } |
| 81 | + |
| 82 | + {BYTE_LITERAL} { return BYTE_LITERAL; } |
| 83 | + {SHORT_LITERAL} { return SHORT_LITERAL; } |
| 84 | + {INT_LITERAL} { return INT_LITERAL; } |
| 85 | + {LONG_LITERAL} { return LONG_LITERAL; } |
| 86 | + {FLOAT_LITERAL} { return FLOAT_LITERAL; } |
| 87 | + {DOUBLE_LITERAL} { return DOUBLE_LITERAL; } |
| 88 | + |
| 89 | + {STRING_LITERAL} { return STRING_LITERAL; } |
| 90 | + {UNQUOTED_STRING_LITERAL} { return UNQUOTED_STRING_LITERAL; } |
| 91 | +} |
| 92 | + |
| 93 | +<IN_BYTE_ARRAY> { |
| 94 | + "(" { return LPAREN; } |
| 95 | + "," { return COMMA; } |
| 96 | + ")" { yybegin(stack.pollFirst()); return RPAREN; } |
| 97 | + |
| 98 | + {BYTE_ARRAY_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return BYTE_LITERAL; } |
| 99 | + |
| 100 | + // Everything below this is invalid |
| 101 | + // we just want to match them correctly so the parser has something to grab on to |
| 102 | + |
| 103 | + // Integers have to be explicitly defined as ints here, implicit numbers are bytes |
| 104 | + {ARRAY_INT_LITEARL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 105 | + |
| 106 | + {SHORT_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return SHORT_LITERAL; } |
| 107 | + {LONG_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return LONG_LITERAL; } |
| 108 | + {FLOAT_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return FLOAT_LITERAL; } |
| 109 | + {DOUBLE_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return DOUBLE_LITERAL; } |
| 110 | + |
| 111 | + {STRING_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return STRING_LITERAL; } |
| 112 | + {UNQUOTED_STRING_LITERAL} { stack.offerFirst(IN_BYTE_ARRAY); yybegin(EXPECT_NEXT); return UNQUOTED_STRING_LITERAL; } |
| 113 | +} |
| 114 | + |
| 115 | +<IN_INT_ARRAY> { |
| 116 | + "(" { return LPAREN; } |
| 117 | + "," { return COMMA; } |
| 118 | + ")" { yybegin(stack.pollFirst()); return RPAREN; } |
| 119 | + |
| 120 | + {INT_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 121 | + |
| 122 | + // Everything below this is invalid |
| 123 | + // we just want to match them correctly so the parser has something to grab on to |
| 124 | + |
| 125 | + {BYTE_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 126 | + {SHORT_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return SHORT_LITERAL; } |
| 127 | + {LONG_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return LONG_LITERAL; } |
| 128 | + {FLOAT_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return FLOAT_LITERAL; } |
| 129 | + {DOUBLE_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return DOUBLE_LITERAL; } |
| 130 | + |
| 131 | + {STRING_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return STRING_LITERAL; } |
| 132 | + {UNQUOTED_STRING_LITERAL} { stack.offerFirst(IN_INT_ARRAY); yybegin(EXPECT_NEXT); return UNQUOTED_STRING_LITERAL; } |
| 133 | +} |
| 134 | + |
| 135 | +<IN_LONG_ARRAY> { |
| 136 | + "(" { return LPAREN; } |
| 137 | + "," { return COMMA; } |
| 138 | + ")" { yybegin(stack.pollFirst()); return RPAREN; } |
| 139 | + |
| 140 | + {LONG_ARRAY_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return LONG_LITERAL; } |
| 141 | + |
| 142 | + // Everything below this is invalid |
| 143 | + // we just want to match them correctly so the parser has something to grab on to |
| 144 | + |
| 145 | + // Integers have to be explicitly defined as ints here, implicit numbers are longs |
| 146 | + {ARRAY_INT_LITEARL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 147 | + |
| 148 | + {BYTE_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return BYTE_LITERAL; } |
| 149 | + {SHORT_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return SHORT_LITERAL; } |
| 150 | + {FLOAT_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return FLOAT_LITERAL; } |
| 151 | + {DOUBLE_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return DOUBLE_LITERAL; } |
| 152 | + |
| 153 | + {STRING_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return STRING_LITERAL; } |
| 154 | + {UNQUOTED_STRING_LITERAL} { stack.offerFirst(IN_LONG_ARRAY); yybegin(EXPECT_NEXT); return UNQUOTED_STRING_LITERAL; } |
| 155 | +} |
| 156 | + |
| 157 | +<IN_LIST> { |
| 158 | + "{" { stack.offerFirst(IN_LIST); stack.offerFirst(EXPECT_NEXT); yybegin(YYINITIAL); return LBRACE; } |
| 159 | + "[" { stack.offerFirst(IN_LIST); stack.offerFirst(EXPECT_NEXT); yybegin(IN_LIST); return LBRACKET; } |
| 160 | + "bytes" { stack.offerFirst(IN_LIST); stack.offerFirst(EXPECT_NEXT); yybegin(IN_BYTE_ARRAY); return BYTES; } |
| 161 | + "ints" { stack.offerFirst(IN_LIST); stack.offerFirst(EXPECT_NEXT); yybegin(IN_INT_ARRAY); return INTS; } |
| 162 | + |
| 163 | + "," { return COMMA; } |
| 164 | + |
| 165 | + "]" { yybegin(stack.pollFirst()); return RBRACKET; } |
| 166 | + |
| 167 | + {BYTE_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 168 | + {SHORT_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return SHORT_LITERAL; } |
| 169 | + {INT_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return INT_LITERAL; } |
| 170 | + {LONG_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return LONG_LITERAL; } |
| 171 | + {FLOAT_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return FLOAT_LITERAL; } |
| 172 | + {DOUBLE_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return DOUBLE_LITERAL; } |
| 173 | + |
| 174 | + {STRING_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return STRING_LITERAL; } |
| 175 | + {UNQUOTED_STRING_LITERAL} { stack.offerFirst(IN_LIST); yybegin(EXPECT_NEXT); return UNQUOTED_STRING_LITERAL; } |
| 176 | +} |
| 177 | + |
| 178 | +<EXPECT_NEXT> { |
| 179 | + "," { yybegin(stack.pollFirst()); return COMMA; } |
| 180 | + ")" { yybegin(stack.pollFirst()); zzMarkedPos = zzStartRead; } |
| 181 | + "]" { yybegin(stack.pollFirst()); zzMarkedPos = zzStartRead; } |
| 182 | +} |
| 183 | + |
| 184 | +{WHITE_SPACE} { return WHITE_SPACE; } |
| 185 | +[^] { return BAD_CHARACTER; } |
0 commit comments