summaryrefslogtreecommitdiff
path: root/Shenanigans/src/org/archphantom/shenanigans
diff options
context:
space:
mode:
Diffstat (limited to 'Shenanigans/src/org/archphantom/shenanigans')
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/Shenanigans.java2
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/parser/Token.java31
-rw-r--r--Shenanigans/src/org/archphantom/shenanigans/parser/Tokenizer.java150
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;
+ }
+
+}