src/Lexer.cc

Sun, 02 Feb 2014 17:06:39 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Sun, 02 Feb 2014 17:06:39 +0200
changeset 88
5def6ff8b466
child 89
029a330a9bef
permissions
-rw-r--r--

- reformatting

88
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 /*
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 Copyright 2012-2014 Santeri Piippo
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 All rights reserved.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 Redistribution and use in source and binary forms, with or without
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 modification, are permitted provided that the following conditions
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 are met:
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 1. Redistributions of source code must retain the above copyright
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 notice, this list of conditions and the following disclaimer.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 2. Redistributions in binary form must reproduce the above copyright
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 notice, this list of conditions and the following disclaimer in the
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 documentation and/or other materials provided with the distribution.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14 3. The name of the author may not be used to endorse or promote products
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 derived from this software without specific prior written permission.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 */
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 #include <cstring>
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 #include "Lexer.h"
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 static StringList gFileNameStack;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 static Lexer* gMainLexer = null;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37 Lexer::Lexer()
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 assert (gMainLexer == null);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 gMainLexer = this;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 Lexer::~Lexer()
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 gMainLexer = null;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 void Lexer::ProcessFile (String fileName)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 gFileNameStack << fileName;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 FILE* fp = fopen (fileName, "r");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 if (fp == null)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 Error ("couldn't open %1 for reading: %2", fileName, strerror (errno));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 LexerScanner sc (fp);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 CheckFileHeader (sc);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 while (sc.GetNextToken())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 // Preprocessor commands:
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 if (sc.GetTokenType() == tkHash)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68 MustGetFromScanner (sc, tkSymbol);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 if (sc.GetTokenText() == "include")
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72 MustGetFromScanner (sc, tkString);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 String fileName = sc.GetTokenText();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 if (gFileNameStack.Contains (fileName))
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 Error ("attempted to #include %1 recursively", sc.GetTokenText());
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
78 ProcessFile (fileName);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 else
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81 Error ("unknown preprocessor directive \"#%1\"", sc.GetTokenText());
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83 else
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 Token tok;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 tok.file = fileName;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87 tok.line = sc.GetLine();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88 tok.column = sc.GetColumn();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
89 tok.type = sc.GetTokenType();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90 tok.text = sc.GetTokenText();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
91
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 // devf ("Token #%1: %2:%3:%4: %5 (%6)\n", mTokens.size(),
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93 // tok.file, tok.line, tok.column, DescribeToken (&tok), DescribeTokenType (tok.type));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 mTokens << tok;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
98
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99 mTokenPosition = mTokens.begin() - 1;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100 gFileNameStack.Remove (fileName);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103 // ============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105 static bool IsValidHeader (String header)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 if (header.EndsWith ("\n"))
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108 header.RemoveFromEnd (1);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
110 StringList tokens = header.Split (" ");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112 if (tokens.Size() != 2 || tokens[0] != "#!botc" || tokens[1].IsEmpty())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113 return false;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115 StringList nums = tokens[1].Split (".");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 if (nums.Size() == 2)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118 nums << "0";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 elif (nums.Size() != 3)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 return false;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 bool okA, okB, okC;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 long major = nums[0].ToLong (&okA);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 long minor = nums[1].ToLong (&okB);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 long patch = nums[2].ToLong (&okC);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 if (!okA || !okB || !okC)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128 return false;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 if (VERSION_NUMBER < MAKE_VERSION_NUMBER (major, minor, patch))
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 Error ("The script file requires " APPNAME " v%1, this is v%2",
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 MakeVersionString (major, minor, patch), GetVersionString (EShortForm));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 return true;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 // ============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139 void Lexer::CheckFileHeader (LexerScanner& sc)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 if (!IsValidHeader (sc.ReadLine()))
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 Error ("Not a valid botscript file! File must start with '#!botc <version>'");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 bool Lexer::GetNext (EToken req)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149 Iterator pos = mTokenPosition;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151 if (mTokens.IsEmpty())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152 return false;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 mTokenPosition++;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156 if (IsAtEnd() || (req != tkAny && GetTokenType() != req))
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
157 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 mTokenPosition = pos;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 return false;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 return true;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 void Lexer::MustGetNext (EToken tt)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 if (!GetNext())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 Error ("unexpected EOF");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172 if (tt != tkAny)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 TokenMustBe (tt);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
177 // eugh..
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
178 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179 void Lexer::MustGetFromScanner (LexerScanner& sc, EToken tt)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
180 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
181 if (!sc.GetNextToken())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 Error ("unexpected EOF");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
183
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
184 if (tt != tkAny && sc.GetTokenType() != tt)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 // TODO
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
187 Token tok;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188 tok.type = sc.GetTokenType();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189 tok.text = sc.GetTokenText();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191 Error ("at %1:%2: expected %3, got %4",
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 gFileNameStack.Last(),
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 sc.GetLine(),
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 DescribeTokenType (tt),
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 DescribeToken (&tok));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
197 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
198
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
201 void Lexer::MustGetAnyOf (const List< EToken >& toks)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
202 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
203 if (!GetNext())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
204 Error ("unexpected EOF");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
205
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
206 for (EToken tok : toks)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
207 if (GetTokenType() == tok)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
208 return;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
209
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
210 String toknames;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
211
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
212 for (const EToken& tokType : toks)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
213 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
214 if (&tokType == &toks.Last())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
215 toknames += " or ";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
216 elif (toknames.IsEmpty() == false)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217 toknames += ", ";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
219 toknames += DescribeTokenType (tokType);
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
222 Error ("expected %1, got %2", toknames, DescribeToken (GetToken()));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
223 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
224
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
225 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
226 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
227 int Lexer::GetOneSymbol (const StringList& syms)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
228 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
229 if (!GetNext())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
230 Error ("unexpected EOF");
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
231
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
232 if (GetTokenType() == tkSymbol)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
233 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
234 for (int i = 0; i < syms.Size(); ++i)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
235 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
236 if (syms[i] == GetToken()->text)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
237 return i;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
238 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
239 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
240
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
241 Error ("expected one of %1, got %2", syms, DescribeToken (GetToken()));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
242 return -1;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
243 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
244
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
245 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
246 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
247 void Lexer::TokenMustBe (EToken tok)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
248 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
249 if (GetTokenType() != tok)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
250 Error ("expected %1, got %2", DescribeTokenType (tok),
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
251 DescribeToken (GetToken()));
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
252 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
253
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
254 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
255 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
256 String Lexer::DescribeTokenPrivate (EToken tokType, Lexer::Token* tok)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
257 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
258 if (tokType < tkLastNamedToken)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
259 return "\"" + LexerScanner::GetTokenString (tokType) + "\"";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
260
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
261 switch (tokType)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
262 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
263 case tkSymbol: return tok ? tok->text : "a symbol";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
264 case tkNumber: return tok ? tok->text : "a number";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
265 case tkString: return tok ? ("\"" + tok->text + "\"") : "a string";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
266 case tkAny: return tok ? tok->text : "any token";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
267 default: break;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
268 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
269
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
270 return "";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
271 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
272
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
273 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
274 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
275 bool Lexer::PeekNext (Lexer::Token* tk)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
276 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
277 Iterator pos = mTokenPosition;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
278 bool r = GetNext();
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
279
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
280 if (r && tk != null)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
281 *tk = *mTokenPosition;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
282
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
283 mTokenPosition = pos;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
284 return r;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
285 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
286
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
287 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
288 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
289 Lexer* Lexer::GetCurrentLexer()
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
290 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
291 return gMainLexer;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
292 }
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
293
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
294 // =============================================================================
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
295 //
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
296 String Lexer::PeekNextString (int a)
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
297 {
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
298 if (mTokenPosition + a >= mTokens.end())
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
299 return "";
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
300
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
301 Iterator oldpos = mTokenPosition;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
302 mTokenPosition += a;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
303 String result = GetToken()->text;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
304 mTokenPosition = oldpos;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
305 return result;
5def6ff8b466 - reformatting
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
306 }

mercurial