summaryrefslogtreecommitdiff
path: root/Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java
diff options
context:
space:
mode:
authorGeonoTRON2000 <geono@thegt.org>2014-05-19 19:18:21 -0700
committerGeonoTRON2000 <geono@thegt.org>2014-05-19 19:18:21 -0700
commit84b8a0f77dbc920d51d611db22fcdf91266a2514 (patch)
tree3cd9b9e52a89f48bf9df0a3a411193e6ecabeb58 /Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java
parent25b9113d1fc2a893bc4a1e693cdec7401ddb5500 (diff)
downloadshenanigans-84b8a0f77dbc920d51d611db22fcdf91266a2514.tar.gz
Decided on Java-only parser, wrote tokenizer.
Diffstat (limited to 'Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java')
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java150
1 files changed, 150 insertions, 0 deletions
diff --git a/Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java b/Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java
new file mode 100644
index 0000000..2917632
--- /dev/null
+++ b/Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java
@@ -0,0 +1,150 @@
+package org.archphantom.shenanigans.parser;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class Tokenizer {
+ private BufferedReader readme;
+ private Object lastRead;
+ private Token lastReadType;
+
+ public Tokenizer (String input) throws IOException {
+ this(new ByteArrayInputStream(input.getBytes()));
+ }
+
+ public Tokenizer (InputStream input) throws IOException {
+ this.readme = new BufferedReader(new InputStreamReader(input));
+ read();
+ }
+
+ private void read () throws IOException {
+ this.lastRead = null;
+ boolean ident = false;
+ boolean number = false;
+ while (true) {
+ char c = (char) readme.read();
+ if (ident && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.' || c == '_')) {
+ readme.mark(1);
+ this.lastRead = ((String) lastRead) + c;
+ } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_') {
+ ident = true;
+ readme.mark(1);
+ this.lastRead = c+"";
+ } else if (c >= '0' && c <= '9' && number) {
+ readme.mark(1);
+ this.lastRead = (Integer) (((Integer) lastRead)*10+(c-'0'));
+ } else if (c >= '0' && c <= '9') {
+ number = true;
+ readme.mark(1);
+ this.lastRead = Integer.valueOf(c-'0');
+ } else {
+ if (ident) {
+ readme.reset();
+ this.lastReadType = Token.Ident;
+ return;
+ } else if (number) {
+ readme.reset();
+ this.lastReadType = Token.Number;
+ return;
+ }
+ switch (c) {
+ case '.':
+ this.lastReadType = Token.Decimal;
+ return;
+ case '$':
+ this.lastReadType = Token.EOS;
+ return;
+ case '+':
+ this.lastReadType = Token.Plus;
+ return;
+ case '-':
+ this.lastReadType = Token.Minus;
+ return;
+ case '*':
+ this.lastReadType = Token.Times;
+ return;
+ case '/':
+ this.lastReadType = Token.Divide;
+ return;
+ case '%':
+ this.lastReadType = Token.Modulo;
+ return;
+ case '(':
+ this.lastReadType = Token.LParen;
+ return;
+ case ')':
+ this.lastReadType = Token.RParen;
+ return;
+ case '[':
+ this.lastReadType = Token.LBrace;
+ return;
+ case ']':
+ this.lastReadType = Token.RBrace;
+ return;
+ case '{':
+ this.lastReadType = Token.LCBracket;
+ return;
+ case '}':
+ this.lastReadType = Token.RCBracket;
+ return;
+ case ';':
+ this.lastReadType = Token.Semicolon;
+ return;
+ case '\'':
+ this.lastReadType = Token.Quote;
+ return;
+ case '\"':
+ this.lastReadType = Token.DQuote;
+ return;
+ case '&':
+ this.lastReadType = Token.And;
+ return;
+ case '|':
+ this.lastReadType = Token.Or;
+ return;
+ case '!':
+ this.lastReadType = Token.Not;
+ return;
+ case '^':
+ this.lastReadType = Token.XOr;
+ return;
+ case '<':
+ this.lastReadType = Token.Less;
+ return;
+ case '>':
+ this.lastReadType = Token.Greater;
+ return;
+ case '=':
+ this.lastReadType = Token.Equal;
+ return;
+ case '@':
+ this.lastReadType = Token.Count;
+ return;
+ case ':':
+ this.lastReadType = Token.NSCall;
+ return;
+ case '#':
+ readme.readLine();
+ return;
+ }
+ }
+ }
+ }
+
+ public Token peak () {
+ return lastReadType;
+ }
+
+ public Object peakVal () {
+ return lastRead;
+ }
+
+ public Token pop () throws IOException {
+ Token lrt = lastReadType;
+ read();
+ return lrt;
+ }
+
+}