1 /*
2    AngelCode Scripting Library
3    Copyright (c) 2003-2015 Andreas Jonsson
4 
5    This software is provided 'as-is', without any express or implied
6    warranty. In no event will the authors be held liable for any
7    damages arising from the use of this software.
8 
9    Permission is granted to anyone to use this software for any
10    purpose, including commercial applications, and to alter it and
11    redistribute it freely, subject to the following restrictions:
12 
13    1. The origin of this software must not be misrepresented; you
14       must not claim that you wrote the original software. If you use
15       this software in a product, an acknowledgment in the product
16       documentation would be appreciated but is not required.
17 
18    2. Altered source versions must be plainly marked as such, and
19       must not be misrepresented as being the original software.
20 
21    3. This notice may not be removed or altered from any source
22       distribution.
23 
24    The original version of this library can be located at:
25    http://www.angelcode.com/angelscript/
26 
27    Andreas Jonsson
28    andreas@angelcode.com
29 */
30 
31 
32 //
33 // as_parser.h
34 //
35 // This class parses the script code and builds a tree for compilation
36 //
37 
38 
39 
40 #ifndef AS_PARSER_H
41 #define AS_PARSER_H
42 
43 #include "as_scriptnode.h"
44 #include "as_scriptcode.h"
45 #include "as_builder.h"
46 #include "as_tokenizer.h"
47 
48 BEGIN_AS_NAMESPACE
49 
50 class asCParser
51 {
52 public:
53 	asCParser(asCBuilder *builder);
54 	~asCParser();
55 
56 	int ParseFunctionDefinition(asCScriptCode *script, bool expectListPattern);
57 	int ParsePropertyDeclaration(asCScriptCode *script);
58 	int ParseDataType(asCScriptCode *script, bool isReturnType);
59 	int ParseTemplateDecl(asCScriptCode *script);
60 
61 #ifndef AS_NO_COMPILER
62 	int ParseScript(asCScriptCode *script);
63 
64 	// Called from compiler
65 	int ParseStatementBlock(asCScriptCode *script, asCScriptNode *block);
66 	int ParseVarInit(asCScriptCode *script, asCScriptNode *init);
67 	int ParseExpression(asCScriptCode *script);
68 #endif
69 
70 	asCScriptNode *GetScriptNode();
71 
72 protected:
73 	void Reset();
74 
75 	void GetToken(sToken *token);
76 	void RewindTo(const sToken *token);
77 	void SetPos(size_t pos);
78 	void Error(const asCString &text, sToken *token);
79 	void Warning(const asCString &text, sToken *token);
80 	void Info(const asCString &text, sToken *token);
81 
82 	asCScriptNode *CreateNode(eScriptNode type);
83 
84 	asCScriptNode *ParseFunctionDefinition();
85 	asCScriptNode *ParseParameterList();
86 	asCScriptNode *SuperficiallyParseExpression();
87 	asCScriptNode *ParseType(bool allowConst, bool allowVariableType = false, bool allowAuto = false);
88 	asCScriptNode *ParseTypeMod(bool isParam);
89 	void           ParseOptionalScope(asCScriptNode *node);
90 	asCScriptNode *ParseRealType();
91 	asCScriptNode *ParseDataType(bool allowVariableType = false, bool allowAuto = false);
92 	asCScriptNode *ParseIdentifier();
93 	bool           ParseTemplTypeList(asCScriptNode *node, bool required = true);
94 
95 	asCScriptNode *ParseListPattern();
96 
97 	bool IsRealType(int tokenType);
98 	bool IsDataType(const sToken &token);
99 	bool IdentifierIs(const sToken &t, const char *str);
100 
101 #ifndef AS_NO_COMPILER
102 	// Statements
103 	asCScriptNode *SuperficiallyParseStatementBlock();
104 	asCScriptNode *SuperficiallyParseVarInit();
105 	asCScriptNode *ParseStatementBlock();
106 	asCScriptNode *ParseStatement();
107 	asCScriptNode *ParseExpressionStatement();
108 	asCScriptNode *ParseSwitch();
109 	asCScriptNode *ParseCase();
110 	asCScriptNode *ParseIf();
111 	asCScriptNode *ParseFor();
112 	asCScriptNode *ParseWhile();
113 	asCScriptNode *ParseDoWhile();
114 	asCScriptNode *ParseReturn();
115 	asCScriptNode *ParseBreak();
116 	asCScriptNode *ParseContinue();
117 
118 	// Declarations
119 	asCScriptNode *ParseDeclaration(bool isClassProp = false, bool isGlobalVar = false);
120 	asCScriptNode *ParseImport();
121 	asCScriptNode *ParseScript(bool inBlock);
122 	asCScriptNode *ParseNamespace();
123 	asCScriptNode *ParseFunction(bool isMethod = false);
124 	asCScriptNode *ParseFuncDef();
125 	asCScriptNode *ParseClass();
126 	asCScriptNode *ParseMixin();
127 	asCScriptNode *ParseInitList();
128 	asCScriptNode *ParseInterface();
129 	asCScriptNode *ParseInterfaceMethod();
130 	asCScriptNode *ParseVirtualPropertyDecl(bool isMethod, bool isInterface);
131 	asCScriptNode *ParseEnumeration();
132 	asCScriptNode *ParseTypedef();
133 	void ParseMethodOverrideBehaviors(asCScriptNode *funcNode);
134 	bool IsVarDecl();
135 	bool IsVirtualPropertyDecl();
136 	bool IsFuncDecl(bool isMethod);
137 	bool IsLambda();
138 	bool IsFunctionCall();
139 
140 	// Expressions
141 	asCScriptNode *ParseAssignment();
142 	asCScriptNode *ParseAssignOperator();
143 	asCScriptNode *ParseCondition();
144 	asCScriptNode *ParseExpression();
145 	asCScriptNode *ParseExprTerm();
146 	asCScriptNode *ParseExprOperator();
147 	asCScriptNode *ParseExprPreOp();
148 	asCScriptNode *ParseExprPostOp();
149 	asCScriptNode *ParseExprValue();
150 	asCScriptNode *ParseArgList(bool withParenthesis = true);
151 	asCScriptNode *ParseFunctionCall();
152 	asCScriptNode *ParseVariableAccess();
153 	asCScriptNode *ParseConstructCall();
154 	asCScriptNode *ParseCast();
155 	asCScriptNode *ParseConstant();
156 	asCScriptNode *ParseStringConstant();
157 	asCScriptNode *ParseLambda();
158 
159 	bool IsConstant(int tokenType);
160 	bool IsOperator(int tokenType);
161 	bool IsPreOperator(int tokenType);
162 	bool IsPostOperator(int tokenType);
163 	bool IsAssignOperator(int tokenType);
164 
165 	bool CheckTemplateType(const sToken &t);
166 #endif
167 
168 	asCScriptNode *ParseToken(int token);
169 	asCScriptNode *ParseOneOf(int *tokens, int num);
170 
171 	asCString ExpectedToken(const char *token);
172 	asCString ExpectedTokens(const char *token1, const char *token2);
173 	asCString ExpectedOneOf(int *tokens, int count);
174 	asCString ExpectedOneOf(const char **tokens, int count);
175 	asCString InsteadFound(sToken &t);
176 
177 	bool errorWhileParsing;
178 	bool isSyntaxError;
179 	bool checkValidTypes;
180 	bool isParsingAppInterface;
181 
182 	asCScriptEngine *engine;
183 	asCBuilder      *builder;
184 	asCScriptCode   *script;
185 	asCScriptNode   *scriptNode;
186 
187 	asCString tempString; // Used for reduzing amount of dynamic allocations
188 
189 	sToken       lastToken;
190 	size_t       sourcePos;
191 };
192 
193 END_AS_NAMESPACE
194 
195 #endif
196