1 package com.jme3.util.blockparser; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.Reader; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 public class BlockLanguageParser { 11 12 private Reader reader; 13 private ArrayList<Statement> statementStack = new ArrayList<Statement>(); 14 private Statement lastStatement; 15 private int lineNumber = 1; 16 17 private BlockLanguageParser(){ 18 } 19 20 private void reset(){ 21 statementStack.clear(); 22 statementStack.add(new Statement(0, "<root>")); 23 lastStatement = null; 24 lineNumber = 1; 25 } 26 27 private void pushStatement(StringBuilder buffer){ 28 String content = buffer.toString().trim(); 29 if (content.length() > 0){ 30 // push last statement onto the list 31 lastStatement = new Statement(lineNumber, content); 32 33 Statement parent = statementStack.get(statementStack.size()-1); 34 parent.addStatement(lastStatement); 35 36 buffer.setLength(0); 37 } 38 } 39 40 private void load(InputStream in) throws IOException{ 41 reset(); 42 43 reader = new InputStreamReader(in); 44 45 StringBuilder buffer = new StringBuilder(); 46 boolean insideComment = false; 47 char lastChar = '\0'; 48 49 while (true){ 50 int ci = reader.read(); 51 char c = (char) ci; 52 if (c == '\r'){ 53 continue; 54 } 55 if (insideComment && c == '\n'){ 56 insideComment = false; 57 }else if (c == '/' && lastChar == '/'){ 58 buffer.deleteCharAt(buffer.length()-1); 59 insideComment = true; 60 pushStatement(buffer); 61 lastChar = '\0'; 62 }else if (!insideComment){ 63 if (ci == -1 || c == '{' || c == '}' || c == '\n' || c == ';'){ 64 pushStatement(buffer); 65 lastChar = '\0'; 66 if (c == '{'){ 67 // push last statement onto the stack 68 statementStack.add(lastStatement); 69 continue; 70 }else if (c == '}'){ 71 // pop statement from stack 72 statementStack.remove(statementStack.size()-1); 73 continue; 74 }else if (c == '\n'){ 75 lineNumber++; 76 }else if (ci == -1){ 77 break; 78 } 79 }else{ 80 buffer.append(c); 81 lastChar = c; 82 } 83 } 84 } 85 } 86 87 public static List<Statement> parse(InputStream in) throws IOException { 88 BlockLanguageParser parser = new BlockLanguageParser(); 89 parser.load(in); 90 return parser.statementStack.get(0).getContents(); 91 } 92 } 93