A bit of work for current SVN support for tilemanager (can read "tiles" block now...
[supertux.git] / tools / tilemanager / Parser.cs
1 using System;
2 using System.IO;
3
4 namespace Lisp
5 {
6
7 public class Parser {
8     public enum LispType {
9         START_LIST,
10         END_LIST,
11         SYMBOL,
12         INTEGER,
13         STRING,
14         REAL,
15         BOOLEAN
16     };
17     private Lexer lexer;
18     private Lexer.TokenType token;
19
20     public Parser(StreamReader stream) {
21         lexer = new Lexer(stream);
22     }
23
24     public bool Parse() {
25         token = lexer.GetNextToken();
26         if(delayinc) {
27             depth++;
28             delayinc = false;
29         }
30         if(token == Lexer.TokenType.EOF) {
31             depth = 0;
32             return false;
33         }
34
35         /*
36         Console.WriteLine("Token: " + token.ToString() + " - " +
37                 lexer.TokenString);
38         */
39         switch(token) {
40             case Lexer.TokenType.CLOSE_PAREN:
41                 if(depth == 0)
42                     throw new Exception("Parse Error: unexpected )");
43                 depth--;
44                 type = LispType.END_LIST;
45                 break;
46             case Lexer.TokenType.OPEN_PAREN:
47                 type = LispType.START_LIST;
48                 delayinc = true;
49                 break;
50             case Lexer.TokenType.SYMBOL:
51                 type = LispType.SYMBOL;
52                 break;
53             case Lexer.TokenType.STRING:
54                 type = LispType.STRING;
55                 break;
56             case Lexer.TokenType.TRUE:
57                 type = LispType.BOOLEAN;
58                 break;
59             case Lexer.TokenType.INTEGER:
60                 type = LispType.INTEGER;
61                 break;
62         }
63         return true;
64     }
65
66     public static void ParseIntList(Parser parser, System.Collections.Generic.List<int> intList) {
67         int d = parser.Depth;
68         while(parser.Depth >= d) {
69                 intList.Add(parser.IntegerValue);
70                 parser.Parse();
71         }
72     }
73
74     private LispType type;
75     public LispType Type {
76         get { return type; }
77     }
78     private bool delayinc;
79     private int depth;
80     public int Depth {
81         get { return depth; }
82     }
83     //public int IntValue
84     public string SymbolValue {
85         get { return lexer.TokenString; }
86     }
87     public string StringValue {
88         get { return lexer.TokenString; }
89     }
90     public int IntegerValue {
91         get { return Int32.Parse(lexer.TokenString); }
92     }
93     public bool BoolValue {
94         get { return StringValue == "t"; }
95     }
96     public float FloatValue {
97         get { return Single.Parse(lexer.TokenString); }
98     }
99 }
100
101 }