static void StmtExpr( void ) { ChkStmtExpr(); switch( CurToken ) { case T_IF: case T_WHILE: case T_DO: case T_FOR: case T_SWITCH: case T_CASE: case T_DEFAULT: case T_BREAK: case T_CONTINUE: case T_RETURN: case T_GOTO: case T_LEFT_BRACE: case T_RIGHT_BRACE: Expecting( Tokens[ T_SEMI_COLON ] ); break; default: Expecting( Tokens[ T_SEMI_COLON ] ); case T_SEMI_COLON: NextToken(); break; } }
int DSNLEXER::NeedSYMBOL() throw( IO_ERROR ) { int tok = NextTok(); if( !IsSymbol( tok ) ) Expecting( DSN_SYMBOL ); return tok; }
int DSNLEXER::NeedSYMBOLorNUMBER() throw( IO_ERROR ) { int tok = NextTok(); if( !IsSymbol( tok ) && tok!=DSN_NUMBER ) Expecting( "symbol|number" ); return tok; }
bool CfgList::Parse (CfgBuffer& buf, bool root) { if (!root) { SkipWhitespace (buf); if (*buf != '{') { Expecting (buf, "{"); return false; } ++buf; } while (!SkipWhitespace (buf)) { if (*buf == '}') { ++buf; return true; } childs.push_back (CfgListElem()); if (!childs.back ().Parse (buf)) return false; } if (!root && buf.end()) { buf.ShowLocation (), logPrintf ("Unexpected end of node at line\n"); return false; } return true; }
void MustRecog( // REQUIRE A SPECIFIC TOKEN AND SCAN NEXT int this_token ) // - token to be recognized { int alt_token; /* also accept alternative tokens (digraphs) */ if( this_token == T_LEFT_BRACKET ) { alt_token = T_ALT_LEFT_BRACKET; } if( this_token == T_RIGHT_BRACKET ) { alt_token = T_ALT_RIGHT_BRACKET; } if( this_token == T_LEFT_BRACE ) { alt_token = T_ALT_LEFT_BRACE; } if( this_token == T_RIGHT_BRACE ) { alt_token = T_ALT_RIGHT_BRACE; } else { alt_token = this_token; } if( ( CurToken != this_token ) && ( CurToken != alt_token ) ) { Expecting( Tokens[ this_token ] ); if( CurToken != T_EOF ) { NextToken(); } } else { NextToken(); } }
bool CfgBuildOptions::Parse (CfgBuffer& buf) { if (!SkipKeyword (buf, "buildoptions")) return false; if (SkipWhitespace (buf) || *buf != '{') { Expecting (buf, "token {"); return false; } ++buf; while (!SkipWhitespace (buf)) { BuildOpt *opt = new BuildOpt; if (*buf == '}') { ++buf; break; } if (!ParseIdent (buf, opt->name)) { delete opt; return false; } builds.push_back (opt); opt->count = 1; while (!SkipWhitespace (buf)) { if (*buf == '*') // its a multiplier { ++buf; CfgNumeric val; if (!val.Parse (buf)) return false; opt->count = val.value; } else if (*buf == '{') // its a set of conditions { opt->info = new CfgList; if (!opt->info->Parse (buf)) return false; } else break; } } return true; }
CfgValue* CfgValue::ParseValue (CfgBuffer& buf) { CfgValue *v = 0; if (SkipWhitespace (buf)) { Expecting (buf, "Value"); return 0; } for (int a=0;a<classes.size();a++) { if (classes[a]->Identify (buf)) { v = classes[a]->Create (); if (!v->Parse (buf)) { delete v; return 0; } return v; } } // parse standard value types: char r = Lookahead (buf); if(buf.CompareIdent ("file")) { // load a nested config file return LoadNestedFile (buf); } else if(isalpha (*buf)) { v = new CfgLiteral; ((CfgLiteral*)v)->ident = true; } else if(isdigit (r) || *buf == '.' || *buf == '-') v = new CfgNumeric; else if(*buf == '"') v = new CfgLiteral; else if(*buf == '{') v = new CfgList; if (v && !v->Parse (buf)) { delete v; return 0; } return v; }
void DSNLEXER::NeedRIGHT() throw( IO_ERROR ) { int tok = NextTok(); if( tok != DSN_RIGHT ) Expecting( DSN_RIGHT ); }