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