示例#1
0
void Parser::MethodDecls()
{
	if(look.kind == RBRACE)
		return;
	MethodDecl();
	MethodDecls();
}
program* sintactico::Program()
{
    list<statementMethodecl*> *list_methodecl = new list<statementMethodecl*>();
    list<statementFieldecl*> *list_fieldecl = new list<statementFieldecl*>();
    if(CurrentToken->tipo == KWCLASS)
    {
        CurrentToken = Lexer->NexToken();
        string class_name = ClassName();
        if(Fallo)
            return NULL;

        if(CurrentToken->tipo == LLAVE_I)
        {
            CurrentToken = Lexer->NexToken();
            Token T[2];
            T[0] = *CurrentToken;
            while(CurrentToken->tipo == KWBOOL || CurrentToken->tipo == KWINT ||
                  CurrentToken->tipo ==KWVOID)
            {
                if(CurrentToken->tipo == KWVOID)
                {
                    CurrentToken = Lexer->NexToken();
                    T[1] = *CurrentToken;
                    CurrentToken = Lexer->NexToken();
                    list_methodecl->push_back(MethodDecl(T));
                    if(Fallo)
                        return NULL;
                    continue;
                }
                CurrentToken = Lexer->NexToken();
                T[1] = *CurrentToken;
                if(CurrentToken->tipo == IDENTIFICADOR){
                    CurrentToken = Lexer->NexToken();
                    if(CurrentToken->tipo == PARENTESIS_I)
                    {
                        list_methodecl->push_back(MethodDecl(T));
                        if(Fallo)
                            return NULL;
                    }
                    else
                    {
                        list_fieldecl->push_back(FieldDecl(T));
                        if(Fallo)
                            return NULL;
                    }
                }
            }
        }
        if(CurrentToken->tipo != LLAVE_D)
        {
            Fallo = true;
            MensajeError("Se esperaba '}'",Lexer->linea);
            return NULL;
        }
        CurrentToken = Lexer->NexToken();
        program *prog = new program(class_name,list_methodecl,list_fieldecl);
        return prog;

    }
    else
    {
        Fallo = true;
        MensajeError("Se esperaba class",Lexer->linea);
        return NULL;
    }
}