aboutsummaryrefslogtreecommitdiff
path: root/engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java')
-rw-r--r--engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java92
1 files changed, 92 insertions, 0 deletions
diff --git a/engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java b/engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java
new file mode 100644
index 0000000..6dfa6b8
--- /dev/null
+++ b/engine/src/core/com/jme3/util/blockparser/BlockLanguageParser.java
@@ -0,0 +1,92 @@
+package com.jme3.util.blockparser;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BlockLanguageParser {
+
+ private Reader reader;
+ private ArrayList<Statement> statementStack = new ArrayList<Statement>();
+ private Statement lastStatement;
+ private int lineNumber = 1;
+
+ private BlockLanguageParser(){
+ }
+
+ private void reset(){
+ statementStack.clear();
+ statementStack.add(new Statement(0, "<root>"));
+ lastStatement = null;
+ lineNumber = 1;
+ }
+
+ private void pushStatement(StringBuilder buffer){
+ String content = buffer.toString().trim();
+ if (content.length() > 0){
+ // push last statement onto the list
+ lastStatement = new Statement(lineNumber, content);
+
+ Statement parent = statementStack.get(statementStack.size()-1);
+ parent.addStatement(lastStatement);
+
+ buffer.setLength(0);
+ }
+ }
+
+ private void load(InputStream in) throws IOException{
+ reset();
+
+ reader = new InputStreamReader(in);
+
+ StringBuilder buffer = new StringBuilder();
+ boolean insideComment = false;
+ char lastChar = '\0';
+
+ while (true){
+ int ci = reader.read();
+ char c = (char) ci;
+ if (c == '\r'){
+ continue;
+ }
+ if (insideComment && c == '\n'){
+ insideComment = false;
+ }else if (c == '/' && lastChar == '/'){
+ buffer.deleteCharAt(buffer.length()-1);
+ insideComment = true;
+ pushStatement(buffer);
+ lastChar = '\0';
+ }else if (!insideComment){
+ if (ci == -1 || c == '{' || c == '}' || c == '\n' || c == ';'){
+ pushStatement(buffer);
+ lastChar = '\0';
+ if (c == '{'){
+ // push last statement onto the stack
+ statementStack.add(lastStatement);
+ continue;
+ }else if (c == '}'){
+ // pop statement from stack
+ statementStack.remove(statementStack.size()-1);
+ continue;
+ }else if (c == '\n'){
+ lineNumber++;
+ }else if (ci == -1){
+ break;
+ }
+ }else{
+ buffer.append(c);
+ lastChar = c;
+ }
+ }
+ }
+ }
+
+ public static List<Statement> parse(InputStream in) throws IOException {
+ BlockLanguageParser parser = new BlockLanguageParser();
+ parser.load(in);
+ return parser.statementStack.get(0).getContents();
+ }
+}