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