• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
BlockLanguageParser()17     private BlockLanguageParser(){
18     }
19 
reset()20     private void reset(){
21         statementStack.clear();
22         statementStack.add(new Statement(0, "<root>"));
23         lastStatement = null;
24         lineNumber = 1;
25     }
26 
pushStatement(StringBuilder buffer)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 
load(InputStream in)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 
parse(InputStream in)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