예제 #1
0
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;
    }
}
예제 #2
0
int DSNLEXER::NeedSYMBOL() throw( IO_ERROR )
{
    int tok = NextTok();
    if( !IsSymbol( tok ) )
        Expecting( DSN_SYMBOL );
    return tok;
}
예제 #3
0
int DSNLEXER::NeedSYMBOLorNUMBER() throw( IO_ERROR )
{
    int  tok = NextTok();
    if( !IsSymbol( tok ) && tok!=DSN_NUMBER )
        Expecting( "symbol|number" );
    return tok;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #7
0
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;
}
예제 #8
0
void DSNLEXER::NeedRIGHT() throw( IO_ERROR )
{
    int tok = NextTok();
    if( tok != DSN_RIGHT )
        Expecting( DSN_RIGHT );
}