diff options
3 files changed, 182 insertions, 1 deletions
diff --git a/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java b/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java index c159053..fa4edc0 100644 --- a/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java +++ b/Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java @@ -27,7 +27,7 @@ public class Shenanigans { System.out.println(HELP_STRING); return; } - if ((args[i].equals("-p") || args[i].equalsIgnoreCase("--PARSED")) && (i+1) < args.length) { + if ((args[i].equals("-p") || args[i].equalsIgnoreCase("--parsed")) && (i+1) < args.length) { pstreams.add(new FileInputStream(args[i+1])); useparsed = true; } diff --git a/Shenanigans/src/org/archphantom/shenanigans/parser/Token.java b/Shenanigans/src/org/archphantom/shenanigans/parser/Token.java new file mode 100644 index 0000000..4175079 --- /dev/null +++ b/Shenanigans/src/org/archphantom/shenanigans/parser/Token.java @@ -0,0 +1,31 @@ +package org.archphantom.shenanigans.parser; + +public enum Token { + Number, // + Decimal, // + Ident, // + EOS, // + Plus, // + Minus, // + Times, // + Divide, // + Modulo, // + LParen, // + RParen, // + LBrace, // + RBrace, // + LCBracket, // + RCBracket, // + Semicolon, // + Quote, // + DQuote, // + And, // + Or, // + Not, // + XOr, // + Equal, // + Less, // + Greater, // + Count, // + NSCall // +} 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; + } + +} |
