asCScriptNode *asCParser::ParseScript() { asCScriptNode *node = new asCScriptNode(snScript); // Determine type of node sToken t1; for(;;) { while( !isSyntaxError ) { GetToken(&t1); RewindTo(&t1); if( t1.type == ttImport ) node->AddChildLast(ParseImport()); else if( t1.type == ttClass ) node->AddChildLast(ParseClass()); else if( t1.type == ttInterface ) node->AddChildLast(ParseInterface()); else if( t1.type == ttConst ) node->AddChildLast(ParseGlobalVar()); else if( IsDataType(t1.type) ) { if( IsVarDecl() ) node->AddChildLast(ParseGlobalVar()); else node->AddChildLast(ParseFunction()); } else if( t1.type == ttEndStatement ) { // Ignore a semicolon by itself GetToken(&t1); } else if( t1.type == ttEnd ) return node; else { asCString str; const char *t = asGetTokenDefinition(t1.type); if( t == 0 ) t = "<unknown token>"; str.Format(TXT_UNEXPECTED_TOKEN_s, t); Error(str.AddressOf(), &t1); } } if( isSyntaxError ) { // Search for either ';' or '{' or end GetToken(&t1); while( t1.type != ttEndStatement && t1.type != ttEnd && t1.type != ttStartStatementBlock ) GetToken(&t1); if( t1.type == ttStartStatementBlock ) { // Find the end of the block and skip nested blocks int level = 1; while( level > 0 ) { GetToken(&t1); if( t1.type == ttStartStatementBlock ) level++; if( t1.type == ttEndStatementBlock ) level--; if( t1.type == ttEnd ) break; } } isSyntaxError = false; } } return 0; }
bool TemplateParser::ParseMacro() { Ident ident; ident = ParseIdent(); switch (ident) { case ID_WXPARENT: return ParseWxParent(); break; case ID_PARENT: return ParseParent(); break; case ID_FORM: return ParseForm(); break; case ID_IFNOTNULL: return ParseIfNotNull(); break; case ID_IFNULL: return ParseIfNull(); break; case ID_FOREACH: return ParseForEach(); break; case ID_PREDEFINED: return ParsePred(); break; case ID_PREDEFINED_INDEX: return ParseNPred(); break; case ID_CHILD: return ParseChild(); break; case ID_NEWLINE: return ParseNewLine(); break; case ID_IFEQUAL: ParseIfEqual(); break; case ID_IFNOTEQUAL: ParseIfNotEqual(); break; case ID_IFPARENTTYPEEQUAL: ParseIfParentTypeEqual(); break; case ID_IFPARENTCLASSEQUAL: ParseIfParentClassEqual(); break; case ID_IFPARENTTYPENOTEQUAL: ParseIfParentTypeNotEqual(); break; case ID_IFPARENTCLASSNOTEQUAL: ParseIfParentClassNotEqual(); break; case ID_APPEND: ParseAppend(); break; case ID_CLASS: ParseClass(); break; case ID_INDENT: ParseIndent(); break; case ID_UNINDENT: ParseUnindent(); break; case ID_IFTYPEEQUAL: ParseIfTypeEqual(); break; case ID_IFTYPENOTEQUAL: ParseIfTypeNotEqual(); break; case ID_UTBL: ParseLuaTable(); break; default: THROW_WXFBEX( wxT("Invalid Macro Type") ); break; } return true; }